Erreichen von memory_limit...

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Erreichen von memory_limit...

    Hey,

    ich möchte alle Artikel aus der Datenbank ca. 500.000 in ein XML-Dokument für die Goolge-Sitemap packen.
    Das klappt auch alles fein, allerdings wird beim Schreiben der Daten in die XML-Datei irgendwann das memory_limit erreicht.
    Ich versuche eigentlich alles was geht mit unset() in der Schleife wieder freizugeben, aber das funktioniert nicht.
    Weiß jemand warum? Wie kann ich den Speicher zur Laufzeit wieder freigeben?

    Hier meine Funktion (Klassen-Auszug):
    Ich hab die Stelle mit einem Kommentar versehen, woe das Problem auftritt!

    PHP-Code:
    <?php
    ....
    public function 
    products_createSitemap($strSitemapPath NULL)
    {
        
    // Maximale Einträge in einer XML-Datei
        
    $intMaxSitemapEntrys 25000;
        
    $arrSQLCmd = array();

        if (
    is_null($strSitemapPath)) $strSitemapPath DOCROOT.'sitemap/';

        
    // Gesamte Einträge zählen
        
    $arrProducts $this->mysql_select("SELECT count(article_id) as entrys FROM data_articles LIMIT 1");
        
    $intEntrys $arrProducts[0]['entrys'];

        
    // XML-Inhalt ermitteln
        
    $intStart 0;
        
    $intSitemaps ceil($intEntrys/$intMaxSitemapEntrys);
        for (
    $a=0$a<$intSitemaps$a++)
        {
            if (
    $a$intStart = ($a*$intMaxSitemapEntrys);
            
    // Nötige Dateinamen ermitteln
            
    $arrSQLCmd[$a]['filename'] = 'sitemap'.$a.'.xml';
            
    // SQL-Statment für nötige Produkte für dieses XML-File
            
    $arrSQLCmd[$a]['sqlcmd'] = "SELECT modified,article_id,name,permalink FROM data_articles
                                        LIMIT "
    .($intStart+1).",".($intStart+$intMaxSitemapEntrys);
        }
        
    // XML-Dateien anlegen und Inhalte einfügen
        
    for ($a=0$a<count($arrSQLCmd); $a++)
        {
            
    /*******************
             * Und ab hier entsteht die Aufblähung des Speichers !!!!
             ******************/
        
            // Datei anlegen
            
    $strSitemapFilename $strSitemapPath.$arrSQLCmd[$a]['filename'];
            if (
    $handle fopen($strSitemapFilename,'w'))
            {
                
    // Kopf schreiben
                
    fwrite($handle,'<?xml version="1.0" encoding="UTF-8"'.chr(63).'>'.$strLineBreak);
                
    fwrite($handle,'<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">'.$strLineBreak);

                
    // SQL-Statment ausführen und Ergebnis in XML speichern
                
    $arrProducts $this->mysql_select($arrSQLCmd[$a]['sqlcmd']);
                if (
    $arrProducts)
                {
                    for (
    $b=0$b<count($arrProducts); $b++)
                    {
                    
    fwrite($handle,'<url>'.$strLineBreak);
                    
    fwrite($handle,'<loc>'.$arrProducts[$b]['permalink'].'</loc>'.$strLineBreak);
                    
    fwrite($handle,'<lastmod>'.date('Y-m-d',$arrProducts[$b]['modified']).'</lastmod>'.$strLineBreak);
                        
    fwrite($handle,'<changefreq>weekly</changefreq>'.$strLineBreak);
                    
    fwrite($handle,'</url>'.$strLineBreak);
                    }
                }
                
    fwrite($handle,'</urlset>'.$strLineBreak);
                
    fclose($handle);
                unset(
    $handle);
                unset(
    $arrProducts);
            }
            else
            {
                return 
    false;
            }
        }
        
    // Index-Sitemap erstellen
        
    if ($handle fopen(DOCROOT.'sitemap.xml','w'))
        {
            
    fwrite($handle,'<?xml version="1.0" encoding="UTF-8"'.chr(63).'>'.$strLineBreak);
            
    fwrite($handle,'<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'.$strLineBreak);

            for (
    $a=0$a<count($arrSQLCmd); $a++)
            {
                
    fwrite($handle,'<sitemap>'.$strLineBreak);
                
    fwrite($handle,'<loc>'.WEBROOT.'sitemap/'.$arrSQLCmd[$a]['filename'].'</loc>'.$strLineBreak);
                
    fwrite($handle,'<lastmod>'.date('Y-m-d',time()).'</lastmod>'.$strLineBreak);
                
    fwrite($handle,'</sitemap>'.$strLineBreak);

            }
            
    fwrite($handle,'</sitemapindex>'.$strLineBreak);
            
    fclose($handle);
        }
        else
        {
            return 
    false;
        }
        return 
    true;
    }
    ...
    ?>
    Danke!
    Zuletzt geändert von TriphunEM; 10.12.2008, 10:35.

  • #2
    das problem kriegst du nicht mit unset() weg. deine datei wird einfach zu groß. splitte die doch in mehrere teile auf und gib google noch einen index für die verschiedenen sitemap-dateien mit
    it's not a bug,
    it's a feature!

    Kommentar


    • #3
      Wenn du in die Funktion schaust, siehst du das ich den Inhalt in mehrere XMLs splitte und zum Schluss eine Index-Sitemap anlege.

      Auch wenn ich den Inhalt der Dateien verkleinere, sprich die erste Variable "$intMaxSitemapEntrys" einen kleineren wert gebe, werden einfach mehrere XMLs erzeugt, aber das Problem ist das Selbe!???

      Kommentar


      • #4
        Deine komischen mysql Methoden sind das Problem!

        Wenn du schön mit mysql_fetch_array() arbeiten würdest, wäre alles in Butter. Dann könntest du die Datei auch in einem Rumms zusammenstöpseln.
        Wir werden alle sterben

        Kommentar


        • #5
          jap stimmt. habs auch jetzt so umgeändert und es läuft!

          Kommentar

          Lädt...
          X