Fatal error: Allowed memory size...

Status
Niet open voor verdere reacties.

royduin

Gebruiker
Lid geworden
6 mei 2006
Berichten
583
Beste forum leden,

ik ben bezig met een script dat producten importeert, omschrijvingen en afbeeldingen download en opslaat. Het gaat om een totaal van 5000 producten!
Helaas krijg ik de volgende melding:
Code:
Fatal error: Allowed memory size of 209715200 bytes exhausted (tried to allocate 79 bytes) in /home/***/domains/***/public_html/inc/simple_html_dom.php on line 895

Momenteel heb ik het volgende script, dit kan denk ik eenvoudiger en sneller:
Code:
<?php
function product_afbeelding_*** ($id){
	include_once("inc/simple_html_dom.php");
	$html = file_get_html("http://***/info/".$id."/info.html");
	$a = 1;
	foreach($html->find('a') as $img){
		if(strstr($img->href, "jpg")){
			$url = 'http://www.***.nl'.$img->href;
			$img = '/home/***/domains/***/public_html/img/product/'.$id.'-'.$a.'.jpg';
			file_put_contents($img, file_get_contents($url));
			$string .= $id.'-'.$a.'.jpg,';
			$a++;
		}
	}
	return $string;
}
function product_omschrijving_*** ($id){
	$regels = file("http://***.nl/info/".$id."/info.html"); 
	$i = 0; 
	foreach($regels as $regel){
		$pos = strpos($regel, '<input type="button" value="Bestel" class="orderbutton" onClick="addProductOBN('.$id.');">');
		if($pos){
			$start = $i+3;
		}
		$i++;
	}
	$a = $start;
	foreach($regels as $regel){
		$pos2 = eregi('<div align="right" class="normal small">', $regels[$a]);
		if($pos2){
			break;
		} else {
			$tekst = str_replace(' class="normal"', "", $regels[$a]);
			$tekst = str_replace(' valign=top', "", $tekst);
			$tekst = str_replace(' class=normal', "", $tekst);
			$tekst = str_replace('<td><a href="/compare?artnr='.$id.'" title="Productvergelijking">Product toevoegen aan vergelijking</a></td>', "", $tekst);
			$tekst = str_replace('<td><b>Productvergelijking</b></td>', "", $tekst);
			$tekst = str_replace('/ext.php?link=', "", $tekst);
			$tekst1 .= $tekst;
		}
		$a++;
	}
	return "<table><tr><td></td><td><table>".rawurldecode($tekst1);
}
ini_set("memory_limit","200M");
include_once('inc/config.php');
include_once('inc/function.php');
echo "#################################################<br>";
echo "## START<br>";
echo "#################################################<br>";
mysql_query("DELETE FROM producten WHERE leverancier='1' AND toegevoegd='0'");
echo "## DATABASE GELEEGD<br>";
echo "#################################################<br>";
$xml = simplexml_load_file('***.xml');
echo "## *** XML bestand geopend<br>";
$a = 0;
foreach($xml as $regeltje){	
	$query = mysql_query("SELECT * FROM categorie_leverancier WHERE leverancier='1' AND cat_leverancier='".mysql_real_escape_string($xml->product[$a]->productgroep)."'");
	$aantal = mysql_num_rows($query);
	if($aantal == FALSE){
		mysql_query("INSERT INTO categorie_leverancier (leverancier, cat_leverancier) VALUES (1, '".mysql_real_escape_string($xml->product[$a]->productgroep)."')");
	}
	$query2 = mysql_query("SELECT * FROM producten WHERE leverancier='1' AND id_leverancier='".mysql_real_escape_string($xml->product[$a]->artnr)."'");
	$aantal = mysql_num_rows($query2);
	if($aantal == FALSE){
		$query3 = mysql_query("SELECT * FROM categorie_leverancier WHERE leverancier='1' AND cat_leverancier='".mysql_real_escape_string($xml->product[$a]->productgroep)."'");
		$obj = mysql_fetch_object($query3);
		$groep = $obj->categorie;
		$afbeelding = product_afbeelding_***(mysql_real_escape_string($xml->product[$a]->artnr));
		$omschrijving = mysql_real_escape_string(product_omschrijving_***($xml->product[$a]->artnr));
		mysql_query("INSERT INTO producten (leverancier, id_leverancier, naam, omschrijving, productgroep, fabrikant, prijs, voorraad, afbeelding, sku, ean, unspsc) VALUES (1, '".mysql_real_escape_string($xml->product[$a]->artnr)."', '".mysql_real_escape_string($xml->product[$a]->omschrijving)."', '".$omschrijving."', '".$groep."', '".mysql_real_escape_string($xml->product[$a]->fabrikant)."', '".mysql_real_escape_string($xml->product[$a]->prijs_ex)."', '".mysql_real_escape_string($xml->product[$a]->aantal_op_voorraad)."', '".$afbeelding."', '".mysql_real_escape_string($xml->product[$a]->sku)."', '".mysql_real_escape_string($xml->product[$a]->ean)."', 0)");
	}
	$a++;
}
echo "## *** categorieën geupdate<br>";
echo "## *** producten geupdate<br>";
echo "## *** prijzen geupdate<br>";
echo "#################################################<br>";
mysql_query("DELETE FROM producten WHERE leverancier='2' AND toegevoegd='0'");
echo "## DATABASE GELEEGD<br>";
echo "#################################################<br>";
$xml = simplexml_load_file('***.xml');
echo "## *** XML bestand geopend<br>";
$a = 0;
foreach($xml as $regeltje){	
	$query = mysql_query("SELECT * FROM categorie_leverancier WHERE leverancier='2' AND cat_leverancier='".mysql_real_escape_string($xml->PRODUCT[$a]->groepomschrijving)."'");
	$aantal = mysql_num_rows($query);
	if($aantal == FALSE){
		mysql_query("INSERT INTO categorie_leverancier (leverancier, cat_leverancier) VALUES (2, '".mysql_real_escape_string($xml->PRODUCT[$a]->groepomschrijving)."')");
	}
	$query2 = mysql_query("SELECT * FROM producten WHERE leverancier='2' AND id_leverancier='".mysql_real_escape_string($xml->PRODUCT[$a]->artikelnummer)."' OR ean='".mysql_real_escape_string($xml->PRODUCT[$a]->EAN)."'");
	$aantal = mysql_num_rows($query2);
	if($aantal == FALSE){
		$query3 = mysql_query("SELECT * FROM categorie_leverancier WHERE leverancier='2' AND cat_leverancier='".mysql_real_escape_string($xml->PRODUCT[$a]->groepomschrijving)."'");
		$obj = mysql_fetch_object($query3);
		$groep = $obj->categorie;
		$afbeelding = 0;
		$omschrijving = 0;
		mysql_query("INSERT INTO producten (leverancier, id_leverancier, naam, omschrijving, productgroep, fabrikant, prijs, voorraad, afbeelding, ean, unspsc) VALUES (2, '".mysql_real_escape_string($xml->PRODUCT[$a]->artikelnummer)."', '".mysql_real_escape_string($xml->PRODUCT[$a]->combi_omschrijving)."', '".$omschrijving."', '".$groep."', '".mysql_real_escape_string($xml->PRODUCT[$a]->merk)."', '".mysql_real_escape_string($xml->PRODUCT[$a]->prijsdealer)."', '".mysql_real_escape_string($xml->PRODUCT[$a]->voorraad)."', '".$afbeelding."', '".mysql_real_escape_string($xml->PRODUCT[$a]->EAN)."', '".mysql_real_escape_string($xml->PRODUCT[$a]->unspsc)."')");
	}
	$a++;
}
echo "## *** categorieën geupdate<br>";
echo "## *** producten geupdate<br>";
echo "## *** prijzen geupdate<br>";
echo "#################################################<br>";
$endtime = microtime();
$endarray = explode(" ", $endtime);
$endtime = $endarray[1] + $endarray[0];
$totaltime = $endtime - $starttime; 
$totaltime = round($totaltime,5);
echo "## Geladen in ".$totaltime." seconden.<br>";
echo "#################################################<br>";
echo "## Copyright 2010 ***";
?>
 
Laatst bewerkt:
Check je php.ini bestand. Lijkt mij dat je daar een te lage waarde hebt staan, nu.
Kijk naar de regel met memory_limit =
Als ik het zo zie moet die 200M of (veiligheidshalve) nóg hoger zijn.

Tijs.
 
Nou, als het goed is zou daar dan moeten staan:

Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 79 bytes) in /home/***/domains/***/public_html/inc/simple_html_dom.php on line 895

ipv.

Fatal error: Allowed memory size of 209715200 bytes exhausted (tried to allocate 79 bytes) in /home/***/domains/***/public_html/inc/simple_html_dom.php on line 895

Klopt het dat de melding er nu inderdaad zo uitziet? Indien ja, dan zou 512MB nóg niet genoeg zijn.

Tijs.
 
Heb hem nu op 1024MB staan met dus de volgende melding:
Code:
Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 64 bytes) in /home/***/domains/***/public_html/inc/simple_html_dom.php on line 750

Lijkt me niet normaal dat een script zoveel tegelijk nodig heeft. En bij 4096MB stopt het lijkt mij, meer werkgeheugen zit er niet in de server. Is er geen manier om alles wat rustiger aan te doen? Hij mag er ook een half uur over doen om dit script uit te voeren, als het maar goed gebeurd zonder foutmeldingen.
 
je kunt het script optimaliseren (per id vraag je 2 keer een website, dus bij 5000 items vraag je 10.000 urls op terwijl dit ook met 5000 kan - verder kun je de insert queries combineren om meerdere records per keer in te voeren, bijvoorbeeld 500 per query) maar de foutmelding komt niet rechtstreeks uit je eigen script, maar uit de include. Er lijkt een memory leak in simple_html_dom.php te zitten.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan