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!
Danke!
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;
}
...
?>
Kommentar