Zadejte hledaný výraz...

Jak spustit PHP úlohu v Cronu, když hosting nepovoluje dostatečný timeout pro vykonání celé úlohy?

Petr Holomoj
verified
rating uzivatele
(22 hodnocení)
30. 3. 2016 13:34:41
Jan Stejskal
Meta tag, jsem napsal, jako příklad toho to jsem jsem již zkoušel. Osobně mi fungoval, ale při testování dokázal aktualizovat cron asi 10x následně narazil na limit. Proto bych se přikláněl pro limit podle počtu procesů
acidclick
1 produkt / 1s je zprůměrovaná doba, kdy skript dokáže zpracovat produkt. Již jsem zkoušel proces rozdělit na operace podle náročnosti, ale výsledná doba, než byl produkt opět v nabídce byla oproti náročnosti která stoupla výrazná, proto skript zpracuje produkt jako celek a pokračuje dále, ale i kdyby se obrázky upravovali jednou měsíčně, tak stále je problém v tom, že během časového limitu skript nedokáže zpracovat všechny obrázky.
Martin Schlemmer
Ano, bylo by to jednodušší. Opravdu jsem zde narazil na limit daného hostingu.
Moje první reakce byla stejná, bohužel, zde jsem narazil na jistou neochotu platit za vyšší výkon i z části i nabídku daného hostingu.
Jelikož se takovéto velké importy množí, tak by mě i z hlediska sebezdokonalování zajímalo, zda je technicky možné při využívání "standardního" hostingu, skript obnovit, pokud byl spuštěn jako cron úloha
30. 3. 2016 13:34:41
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/strana/2#reply1186237
Filip T.
verified
rating uzivatele
(2 hodnocení)
30. 3. 2016 15:39:23
Moje řešení = hlídej čas
- od timeoutu si odečti "rezervní čas" ( např. 2s ) a s předstihem ukonči skript
- do DB si před ukončením vždy ulož pozici kde si skončil a zda má skript pokračovat
- vytvoř si cron s frekvencí klidně 1s který bude volat jednoduchý skript, který jedinné co udělá, že zkontroluje zda se nachází v DB záznam s "pokračováním"
- pokud tam záznam je, tak tento jednoduchý skript zavolá "parsovací" skript a hned se ukončí ( já ho volám přes Curl s timeoutem 1s - aby na nic nečekal )
lepší řešení mě nenapadlo, ale určitě se nejaké najde. ( tímto způsobem běží vždy jen jedno vlákno, a nijak moc se nezařěžuje server )
30. 3. 2016 15:39:23
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/strana/2#reply1186236
Jan Stejskal
verified
rating uzivatele
(7 hodnocení)
30. 3. 2016 15:45:41
Napsal noname4you;1280889
Moje řešení = hlídej čas
- od timeoutu si odečti "rezervní čas" ( např. 2s ) a s předstihem ukonči skript
- do DB si před ukončením vždy ulož pozici kde si skončil a zda má skript pokračovat
- vytvoř si cron s frekvencí klidně 1s který bude volat jednoduchý skript, který jedinné co udělá, že zkontroluje zda se nachází v DB záznam s "pokračováním"
- pokud tam záznam je, tak tento jednoduchý skript zavolá "parsovací" skript a hned se ukončí ( já ho volám přes Curl s timeoutem 1s - aby na nic nečekal )
lepší řešení mě nenapadlo, ale určitě se nejaké najde. ( tímto způsobem běží vždy jen jedno vlákno, a nijak moc se nezařěžuje server )
Hostingy obvykle neumožňují cron 1 vteřinu a i na vlastním serveru není možné nastavit cron pod minutu. Na to je třeba daemon nebo jiné řešení.
30. 3. 2016 15:45:41
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/strana/2#reply1186235
Ahoj,
před tebou se tady už někdo ptal na podobný problém. Proto odkáži na odpověď, kterou jsem dával:
https://webtrh.cz/320638-php-resite-import-dat?p=1242615#post1242615
Pokud řešíš timeout, tak si ukládej poslední položku, kterou jsi úspěšně uložil do databáze. Další iterací CRONu můžeš pokračovat v ukládání. Nicméně 9k položek zvládneš uložit vcelku rychle, stačí použít syntaxi SQL:
---------- Příspěvek doplněn 31.03.2016 v 22:48 ----------
Aha, vidím, že podobné otázky a odpovědi už zazněly .... tak to zkus takto:
1. stáhni si XML lokálně na disk serveru (třeba do /tmp/feed.xml)
2. Nastav CRON na nejnižší možnou dobu (asi půjde 1* minuta)
3. Existuje soubor /tmp/feed.xml?
> zkontroluj, zda existuje /tmp/lastElement.txt
> existuje? Přeskoč položky /tmp/feed.xml až k ID, které je obsaženo v souboru /tmp/lastElement.txt
> neexistuje? Začni od začátku a vytvoř soubor /tmp/lastElement.txt
> po uložení produktu ulož ID (z /tmp/feed.xml) do /tmp/lastElement.txt
> každou iteraci kontroluj délku běhu a max_execution_time. Jsi-li nad 60%, ukonči chod scriptu a přenech práci další iteraci CRONa. Můžeš otestovat i na více než 60% (tím bych začal).
> pokračuj na další položku
> jsi na konci /tmp/feed.xml? Smaž soubor /tmp/feed.xml + /tmp/lastElement.txt a případně si ulož informaci o datu poslední synchronizace (zde proto těch 60% a ne více, máš jistotu, že dojde k uložení informace o poslední synchronizaci). Tím budeš moct provádět třeba synchronizaci 1* denně, nebo každou hodinu apod.
4. Neexistuje soubor /tmp/feed.xml? Zjisti, zda je čas provést synchronizaci > stáhni feed do /tmp/feed.xml a začni od začátku
Takto jsem zvládal dělat 150MB feed při max_execution_time 30 vteřin ;-)
31. 3. 2016 22:27:24
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/strana/2#reply1186234
Pro odpověď se přihlašte.
Přihlásit