groot xml bestand met php uitlezen en in mysql zetten
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?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>
- <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.
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?
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.