Door
Dennis WhoCares
op 26-09-2016 20:27
gewijzigd op 26-09-2016 20:35
3.196 views
Hoi allemaal,
ik ben aan gigantische import aan het doen met een csv file.
Ik upload een bestand mbv een formulier, daarna kan ik dynamisch kiezen welke kolom bij welke tabel field hoort, en dan verwerken.
Dit process bevat importeren, bestanden downloaden, snapshot maken van video's, afbeeldingen bewerken (vierkant maken, en 4 verschillende formaten)
Iedereen begrijpt dat afhankelijk van wat voor soort bijlagen, en het aantal ervan zorgt voor nogal lange duur van uitvoeren. Dus om de timeout te omzeilen houdt alle gegevens bij in een sessie (gekozen kolom->field, filenaam waarmee gewerkt wordt, en de laatst geimporteerde record) en redirect terug naar de pagina (nu ondertussen naar een 2e en 3e))
Helaas geeft mijn firefox en chrome error 310 terug na enige tijd (Ongeveer na 15-18 redirects)
Ik zie het niet bepaald zitten om elke 300 records alles weer opnieuw te doen om m'n browser maar te gehoorzamen. Het moet juist andersom.
Hoe kan ik dit fixen? Ik zit nou al weken hier aan te werken. Eigenlijk voorheen importeer problemen, en het dynamisch maken van importeer mogelijkheden, downloaden van externe bestanden adv een url etc.
Heeft iemand een workaround hiervoor? Ik hoop het ten zeerste
Moet ongeveer 20.000 records doen om te beginnen, en naderhand zullen deze regelmatig ook nog eens een 'UPDATE' ondergaan.
Maak een cronjob die iedere minuut wordt aangeroepen en dan:
1) uit de database leest of er een actieve taak is.
2) uit de database leest bij welke regel/snapshot/afbeelding hij gebleven is de vorige keer
3) een aantal wenselijke bewerkingen uitvoert op een X aantal regels/snapshots/afbeeldingen
4) in de database schrijft waar hij gebleven is
5) de taak op inactief zet als alle regels/snapshots/afbeeldingen behandeld zijn.
6) een emailtje naar jou stuurt dat de taak volbracht is
Of je past regelmatig je execution time aan, wanneer je met loops bezig bent bijvoorbeeld. Bij elke set_time_limit() call wordt immers de lopende teller gereset naar 0. Geeft je net even wat meer mogelijkheden om echte timeouts wel op te vangen.
Maar los van de time-out van de server, kan ook je browser er na X minuten de brui aan geven. Zeker als er geen tot weinig response van de server komt in de tussentijd.
Of je verbinding heeft 2 seconden de hik en je browser is de verbinding kwijt.
Dit soort processen doe je bij voorkeur via de command line of een cronjob.
Daarbij moet je je afvragen of dat dan in 1 grote job uitgevoerd wordt, of dat je elke 5 minuten iets wilt doen.
Als je voor dat laatste kiest, moet je er ook zeker van zijn dat de vorige job klaar is, of dat het geen probleem is als 2 of meer processen gelijktijdig draaien.
(oh, en die cronjob dan niet weer via wget toch een http-proces laten starten.)
mijn excuses voor de late reactie, ik kom net terug vanuit CZ... >.<
Iedereen hartstikke bedankt voor de reacties.
Deze import is eigenlijk maar 1 keer. Daarna is het alleen 'update' en alleen 'update' van tekst in de database, geen afbeeldingen etc meer.
Zoals ik hieruit begrijp in CLI heeft de commando 'php' geen timeout !?
Dan doe ik dit liever gewoon zonder te redirecten in 1 keer via CLI
Echter zal ik m'n redirects er weer uit moeten halen, en even wat verzinnen op m'n 'settings' die ik instel. Misschien een txt file of even hardcoded bijvoegen voor deze 'incidentele' actie.
Ik was al bijna van plan om alle afbeeldingen handmatig te downloaden (soort van dan, gewoon met 'curl -o <filename> "<url to file>"' en dan te gaan bewerken.
Komt ook weer het een en ander bij kijken.
Ik zal de execution time erbij doen voor de zekerheid zoals Ward van der Put aangeeft.
Ben van Velzen, betekend dit dat.. als ik set_time_limit(0) aan het begin en aan het eind van m'n for loop zet, dat ik geen timeout krijg ?
Want uiteindelijk moet zulke imports wel mogelijk zijn via de browser, eigenlijk...
De import zal nooit zo vreselijk lang duren, ik denk hooguit 3-4 minuten.
Frank Nietbelangrijk,
inderdaad, heb ik ook aan zitten denken. Ik doe hetzelfde met een ander project van mij op het werk, als de cronjob nog steeds als 'running' aangegeven staat, houdt ik ook bij hoevaak deze 'geblokkeerd' is en na 5 keer, dan wordt deze gereset en doet ie het weer.
Ik zou zelfs in de loop de tijd kunnen bij houden dat deze zelf al draait en dan na X minuten de data weg te schrijven voor de volgende 'trigger'.
Momenteel heb ik even last van migraine, maar ik ga morgen ermee aan de slag met de CLI. Is niet heel veel werk, maar nu eventjes niet ;)
>> Ben van Velzen, betekend dit dat.. als ik set_time_limit(0) aan het begin en aan het eind van m'n for loop zet, dat ik geen timeout krijg ?
Bijna. Als je het aan het begin van een loop zet, en je weet dat 1 keer loopen max 5 seconden kost zet je set_time_limit(5) aan het begin van je loop. Sowieso nooit 0. Om het via de browser te kunnen doen zul je je webserver instellingen moeten wijzigen om te zorgen dat er vanuit daar geen timeout komt, en natuurlijk regelmatig output naar de browser sturen om te voorkomen dat de browser geen timeout ziet.
Daarbij: je hoeft het helemaal niet via de browser te doen. Je kunt prima het proces starten in de browser (bijvoorbeeld via een upload), en dan laten overpakken door bijvoorbeeld een cronjob, die op een statuspagina weergeeft hoe ver de import is.