Hallo allemaal,

Ik moet grote xml bestanden verwerken met een grote van 20mb tot 60mb. Ik heb nu een script in elkaar gezet met domit. Alles werkt perfect zolang het xml bestand onder de 1 mb blijft. Als ik het 20mb bestand wil verwerken krijg ik een internal server error 505.

Nu vraag ik me af of ik niet beter een andere manier van verwerken kan gebruiken die deze grote bestanden wel kan verwerken. Ik heb een poging gedaan met simplexml, maar kom daar niet uit.

Iemand tips en/of ideeën voor me hoe ik het beste dit kan aanpakken?

Het moet als volgt werken. Bestand wordt opgehaald van een externe server. Script leest het xml bestand lokaal en ordend de gegevens en zet ze in de mysql database.


  <?xml version="1.0" encoding="ISO-8859-1" ?> 
- <pricelist version="2.0">
  <title></title> 
  <link></link> 
  <description></description> 
  <lastBuildDate></lastBuildDate> 
- <item>
  <productid>a</productid> 
  <name>a</name> 
  <supplier>a</supplier> 
  <subcategory>a</subcategory> 
  <category>a</category> 
  <price>1</price> 
  <qty>1</qty> 
  <vendorcode>a</vendorcode> 
  <eancode>00000</eancode> 
  <expdeldate>2009-01-01</expdeldate> 
  <hotdeal>0</hotdeal> 
  <opisop>0</opisop> 
  <opruiming>0</opruiming> 
  <image_small /> 
  <image_big /> 
  <descn>a</descn> 
  <verwijderingsbijdrage>0.0</verwijderingsbijdrage> 
  <backtoback>0</backtoback> 
  <daily_price>0</daily_price> 
  <end_of_life>0</end_of_life> 
  </item>
- <item>
  <productid>b</productid> 
  <name>b</name> 
  <supplier>b</supplier> 
  <subcategory>b</subcategory> 
  <category>b</category> 
  <price>2</price> 
  <qty>2</qty> 
  <vendorcode>b</vendorcode> 
  <eancode>00000</eancode> 
  <expdeldate>2009-01-01</expdeldate> 
  <hotdeal>0</hotdeal> 
  <opisop>0</opisop> 
  <opruiming>0</opruiming> 
  <image_small /> 
  <image_big /> 
  <descn>b</descn> 
  <verwijderingsbijdrage>0.0</verwijderingsbijdrage> 
  <backtoback>0</backtoback> 
  <daily_price>0</daily_price> 
  <end_of_life>0</end_of_life> 
  </item>


Mocht de enigste oplossing simpleXML zijn, zou iemand me dan een klein voorbeeldje kunnen geven om de losse vars eruit te krijgen met simpleXML?

Alvast bedankt voor jullie tijd en moeite.
Misschien dat je ergens een config file van/op je server moet aanpassen?
Ik heb in php.ini 512mb aangegeven en een verwerktijd van 240 seconden. Maar met het bestand van 20mb stopt hij al na 10 seconden.
Ik loop nu tegen hetzelfde probleem aan. Internal server error bij het werken met XML bestanden uit een rss feed.
Op een andere hostingomgeving waar ik even toegang toe heb gehad, werkt het gewoon zonder problemen.
Kan ik nog iets met een .htaccess bestand regelen?
Zou het beter lukken met een XML Pull parser? Dat is een parser die het bestand van boven naar beneden leest, en bij iedere node die hij tegen komt even stopt en kijkt wat hij moet doen. In tegenstelling tot DOM XML of simplexml hoef je dan niet het hele document tegelijkertijd in het geheugen te hebben.... geloof ik :)

Je zou XMLReader of de oude XML Parser van PHP kunnen proberen. Die geef je functies mee die moeten worden aangeroepen, en dan kan je je document node voor node doorwandelen. Een beetje zoals je dat ook met bijvoorbeeld een result set van MySQL zou doen. Dan hoef je maar één compleet item in je geheugen te hebben in plaats van het hele document.
Ik heb heel weinig ervaring met XML en was al blij dat ik het met domit voor elkaar kreeg. Maar we zullen eens kijken of we ergens kunnen komen met XMLReader. Want jah eigenlijk het enigste wat het script moet doen is een xml bestand checken met de sql db en als er dingen veranderd zijn aanpassen.

Reageren