Dit is dus geen probleem betreft de php set_time_limit/max_execution_time aangezien die zowiezo al op 3600 seconden staat en het script wel volledig uitgevoerd wordt.
Versies:
Apache: 1.3.20
PHP: 4.3.1
MySQL: 4.0.12
Ik heb een probleem met een verschrikkelijk zwaar script dat als cron gerunt wordt waarbij er informatie uit een stuk of 6 tabellen gekopieerd wordt tussen twee MySQL databases. Hierbij moeten er bij sommige nieuwe tabellen nieuwe auto_increments gemaakt worden en juist bij anderen niet (waar dus wel een autoincrement op staat, maar dat is een ander verhaal) dus wordt dit opgelost door dit te kopieeren via een php script waar verschillende klassen gebruikt worden (1 klasse per tabel) die cascading aangeroepen worden en dan dus de juiste handeling uitvoeren. Bij het initialiseren van het script en het afsluiten van het script komt er een stuk info uit waaraan ik kan zien wat het script allemaal gedaan heeft, en tussendoor komt er geen debug informatie uit.
Op zich werkt dit dus prima, mits het om kleine aantallen gaat (max. ongeveer 5000 records van de eerste tabel) en dit neemt op zich al zo'n 10 minuten in beslag.
Wat er dus mis gaat is dat ergens in een van die klassen dus een selectie gemaakt wordt van een rij objecten en dit in een while loop wordt doorlopen. Deze while loop wordt ergens na 5000 keer afgebroken, maar ik krijg dus wel de statistieken te zien van wat het script gedaan heeft die alleen aan het eind van het script worden weergegeven. Dat het bij deze fout gaat kan ik achterhalen door te kijken wat er wel en niet gedaan is in de database. De stap na de while loop wordt dus niet gedaan, maar het script sluit dus wel volledig af.
Nu is het rare dat ik wilde zien hoeveel records er precies gedaan worden en gaf een echo op het net nieuw geinserte id en tot mijn verbazig loopt het script dus wel de gehele kopie actie. Na dit enkele malen te hebben herhaald kan ik vaststellen dat het script dus alleen volledig doorlopen wordt indien ik dus in de while (of ergens in de klassen die cascaded er achteraan komen) output terug geef.
Ik heb het ook al geprobeerd op een oude versie van PHP (4.12) en daar is precies hetzelfde probleem.
Is er misschien iets bekend van een timeout van Apache of bescherming op een klasse in PHP als er voor lange tijd geen output door php terug wordt gegeven en dus maar alles afbreekt? De workaround is op dit moment dus duidelijk: ik geef nu dus wat output terug, maar ik zou toch graag willen achterhalen wat nu precies dit veroorzaakt.
Versies:
Apache: 1.3.20
PHP: 4.3.1
MySQL: 4.0.12
Ik heb een probleem met een verschrikkelijk zwaar script dat als cron gerunt wordt waarbij er informatie uit een stuk of 6 tabellen gekopieerd wordt tussen twee MySQL databases. Hierbij moeten er bij sommige nieuwe tabellen nieuwe auto_increments gemaakt worden en juist bij anderen niet (waar dus wel een autoincrement op staat, maar dat is een ander verhaal) dus wordt dit opgelost door dit te kopieeren via een php script waar verschillende klassen gebruikt worden (1 klasse per tabel) die cascading aangeroepen worden en dan dus de juiste handeling uitvoeren. Bij het initialiseren van het script en het afsluiten van het script komt er een stuk info uit waaraan ik kan zien wat het script allemaal gedaan heeft, en tussendoor komt er geen debug informatie uit.
Op zich werkt dit dus prima, mits het om kleine aantallen gaat (max. ongeveer 5000 records van de eerste tabel) en dit neemt op zich al zo'n 10 minuten in beslag.
Wat er dus mis gaat is dat ergens in een van die klassen dus een selectie gemaakt wordt van een rij objecten en dit in een while loop wordt doorlopen. Deze while loop wordt ergens na 5000 keer afgebroken, maar ik krijg dus wel de statistieken te zien van wat het script gedaan heeft die alleen aan het eind van het script worden weergegeven. Dat het bij deze fout gaat kan ik achterhalen door te kijken wat er wel en niet gedaan is in de database. De stap na de while loop wordt dus niet gedaan, maar het script sluit dus wel volledig af.
Nu is het rare dat ik wilde zien hoeveel records er precies gedaan worden en gaf een echo op het net nieuw geinserte id en tot mijn verbazig loopt het script dus wel de gehele kopie actie. Na dit enkele malen te hebben herhaald kan ik vaststellen dat het script dus alleen volledig doorlopen wordt indien ik dus in de while (of ergens in de klassen die cascaded er achteraan komen) output terug geef.
Ik heb het ook al geprobeerd op een oude versie van PHP (4.12) en daar is precies hetzelfde probleem.
Is er misschien iets bekend van een timeout van Apache of bescherming op een klasse in PHP als er voor lange tijd geen output door php terug wordt gegeven en dus maar alles afbreekt? De workaround is op dit moment dus duidelijk: ik geef nu dus wat output terug, maar ik zou toch graag willen achterhalen wat nu precies dit veroorzaakt.