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 10:30:10
Dobrý den,
mám dotaz, je nějakým možnost jak na klasickém hostingu (timeout 60-90s) udělat reload cronové úlohy. Tedy: mám např. XML FEED, který má 9k položek a je potřeba s těmi údaji několik operací, které v časovém limitu není možné udělat.
Potřebuji zjistit, zda je možné opakovat cronovou úlohu jinak, než po čásovém intevalu, který nabízí hosting.
Našel jsem několik řešení, které nyní zkouším, ale žádné z nich zatím nefunguje.
Pokud s tím máte někdo zkušenosti, budu rád za nápady.
Děkuji
30. 3. 2016 10:30:10
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/#reply1186252
acidclick
verified
rating uzivatele
30. 3. 2016 10:42:27
Například z XML dostat data co potrebujes a ulozit po jednom (nebo vice zaznamech) do db nebo do textaku a pak mit dalsi ulohu v cronu, ktera ty zaznamy bude zpracovavat a odmazavat.
30. 3. 2016 10:42:27
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/#reply1186251
Jan Stejskal
verified
rating uzivatele
(7 hodnocení)
30. 3. 2016 10:58:22
Cronem spustíte úlohu, ta zpracuje co se stihne do timeoutu a před vypršením timeoutu skript spustí sám sebe a bude opět do timeoutu pokračovat. Pokud je k dispozici dostatek vláken, může se celý proces vykonávat souběžně.
30. 3. 2016 10:58:22
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/#reply1186250
Petr Holomoj
verified
rating uzivatele
(22 hodnocení)
30. 3. 2016 11:56:43
acidclick
Z XML jsou data ukládany do DB, potřebnými udaji pro následné zpracování. Ale je zde problém, že hosting poskytuje např. pouze 5 nebo 10 min interval na spouštení. Při timeout 90s se průměrně zpracuje 90 produktů. a je potřeba takto zpracovat 9000 produktů, takže aktualizace produktů by zabrala celý den, než by byly nahrány aktuální data.
Jan Stejskal
Ano, taková je myšlenka. Skript zpracuje určitý počet záznamů a poté se obnoví. Ale žádný způsob který jsem zkoušel.
Např.
exit()
Nebyl trvale účinný obnovit skript na kompletní zpracování požadavku.
30. 3. 2016 11:56:43
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/#reply1186249
TomasX
verified
rating uzivatele
(4 hodnocení)
30. 3. 2016 12:00:29
vykašli se na obcházení timeoutu, prostě si udělej skript na pokračování, práci si rozděli na seznam úloh a pamatuj si, kterou jsi naposledy udělal a od toho pokračuj.
Příklad s xml feedem:
1. xml feed si stáhni přes php k sobě
2. postupně ho parsuj a jednotlivé itemy si ukládej třeba do souborů nebo do databáze jako string
3. pamatuj si pozici v souboru, kterou jsi naposledy přečetl a uměj pokračovat od té pozice
4. itemy z databáze/souborů zase zpracovávej postupně a pamatuj si poslední zpracovaný, případně zpracované mazej
5. opět pokračuje pokud všechny nezpracuješ
Každá úloha lze rozložit na podobnou posloupnost kroků a ty dělat postupně a na pokračování. Rady s obejítím timeoutu výše jsou prakticky problematické, protože nemáš žádnou zpětnou vazbu jestli php ještě běží, jestli ti ho někdo zabil, jestli už práci dokončil, nic, prostě čekáš. Nopak rozložení ti umožní přesně na % sledovat postup.
30. 3. 2016 12:00:29
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/#reply1186248
acidclick
verified
rating uzivatele
30. 3. 2016 12:01:04
No primarne bych se zameril na optimalizaci toho scriptu - 1 produkt za vterinu je zatracene malo.
30. 3. 2016 12:01:04
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/#reply1186247
TomasX
verified
rating uzivatele
(4 hodnocení)
30. 3. 2016 12:05:29
doplnění: můžeš si volat úlohu z venku bez použití jejich cronu. Zdarma je např. u https://uptimerobot.com možnost volat url každých 30s, primárně je účel trochu jiný, kontrola dostupnosti stránek, dá se to ale zneužít jako takový pravidelný cron. Poté ti stačí si sám kontrolovat čas nebo klidně z tabulky z databáze, kdy máš začít stahovat nový feed a případně, jestli máš ještě nějakou rozpracovanou práci, tj. udělat si takový vlastní cron :).
Jinak podobným způsobem funguje zpracování veškerých "big data"
30. 3. 2016 12:05:29
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/#reply1186246
Petr Holomoj
verified
rating uzivatele
(22 hodnocení)
30. 3. 2016 12:17:41
TomášX
Ano, tomu rozumím, tímto postupem, skript funguje
1. Ano, stáhne XML ze serveru, následně nahlíží na uložený souboru
2. Do DB zapíše strom záznamu z XML a potřebné údaje pro párování
3,4. DB slouží jako výchozí údaj o zpracování produktu, pokud je produkt dokončen, záznam z DB je smazán a postupuje na další
5. Pokračuje zcela v pořádku.
Problém je v tom, že toto funguje při spuštění procesu manuálně ( přes prohlížeč ), pokud se spustí cronovou úlohou nedokáže se obnovit, aby v akci pokračoval.
Edit
: na službu se podívám, děkuji
acidclick
Nevím, zda je to málo, skript u jednoho produktu vykonává mnoho operací např.:
- Ověřuje zda produkt neexistuje podle kódu
- Zjišťuje zda existuje výrobce - popřípadě vytváří
- Zjišťuje zda existují kategorie - popřípadě vytváří
- Zjištuje atributy a kombinace produktu - popřípadě vytváří
- Stahuje obrázky produktu z URL, ukládá a vytváří další potřebné formáty
Pak jsou tam porovnání, výpočet cen, úprava popisu, sklady atd.
30. 3. 2016 12:17:41
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/#reply1186245
TomasX
verified
rating uzivatele
(4 hodnocení)
30. 3. 2016 12:19:02
acidclick: nemohu mluvit za autora, ale pokud stahuje a resizuje obrázky, sekunda je klidně možná
30. 3. 2016 12:19:02
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/#reply1186244
Jan Stejskal
verified
rating uzivatele
(7 hodnocení)
30. 3. 2016 12:43:45
Napsal Sketter;1280792
acidclick
Z XML jsou data ukládany do DB, potřebnými udaji pro následné zpracování. Ale je zde problém, že hosting poskytuje např. pouze 5 nebo 10 min interval na spouštení. Při timeout 90s se průměrně zpracuje 90 produktů. a je potřeba takto zpracovat 9000 produktů, takže aktualizace produktů by zabrala celý den, než by byly nahrány aktuální data.
Jan Stejskal
Ano, taková je myšlenka. Skript zpracuje určitý počet záznamů a poté se obnoví. Ale žádný způsob který jsem zkoušel.
Např.
exit()
Nebyl trvale účinný obnovit skript na kompletní zpracování požadavku.
Meta tag v cron úloze z principu ani fungovat nemůže. Je potřeba si vytvořit časovač (hlídat si čas blížící se timeoutu) a skript znovu zavolat. Pro časovač použijte funkci microtime, resp. rozdíl časů. Pro volání skriptu například pomocí fsockopen.
30. 3. 2016 12:43:45
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/#reply1186243
acidclick
verified
rating uzivatele
30. 3. 2016 12:48:42
Napsal TomášX;1280801
acidclick: nemohu mluvit za autora, ale pokud stahuje a resizuje obrázky, sekunda je klidně možná
Ano to muze jedno z uzkych hrdel scriptu a proto to co jde zpracovat rychle udelat a to co trva oddelit (nehlede na to, ze asi tezko se bude kazdy den menit 9000 obrazku a proto je zbytecne je pokazde stahovat a resizovat).
30. 3. 2016 12:48:42
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/#reply1186242
TomasX
verified
rating uzivatele
(4 hodnocení)
30. 3. 2016 12:53:41
Jan Stejskal: nedoporučuji jít přes hlídání vlastního času a spuštění na pozadí znovu. V php není možné nastavit asynchronní časovač a prerušit práci a pokud třeba stahování obrázku bude timeoutovat, mohu překročit maximální dobu a nestihnu spustit další skript. Logika pak kolem toho je obrovská.
acidclick: ano, to máš pravdu, ale implementace etagu nebo if_modified_since při stahování obrázků je už relativně složitá. Poté lze kontrolovat velikost a čas obrázku jestli se změnil a jestli resizovat obrázky, stejně tak lze dělat otisku (md5) a ten kontrolovat proti existujícímu. Stejně tak máš pravdu, že stahování obrázků by mělo jít do vlastní fronty. Na druhou stranu bych se asi klonil k udržení jednoduchosti za cenu vyšších nároků
30. 3. 2016 12:53:41
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/#reply1186241
Nebylo by jednodušší a spolehlivější požádat hosting o dlouhý timeout, klidně za příplatek?
Dlouhodobě by bylo lepší přejít na hosting, kde můžete timeout sám ovlivňovat. Očividně narážíte na hranice toho, co nyní používáte.
30. 3. 2016 13:00:04
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/#reply1186240
Petr Hasil
verified
rating uzivatele
(3 hodnocení)
30. 3. 2016 13:01:40
Napsal Jan Stejskal;1280767
Cronem spustíte úlohu, ta zpracuje co se stihne do timeoutu a před vypršením timeoutu skript spustí sám sebe a bude opět do timeoutu pokračovat. Pokud je k dispozici dostatek vláken, může se celý proces vykonávat souběžně.
Jenom to ne. Cron nesmí spouštět sám sebe. Vklákna by došla velice rychle a na web by se už nikdo nedostal. Je sice hezké, že se předchozí vlákno už ukončilo, ale každých 5, 10 minut se přidá další.
30. 3. 2016 13:01:40
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/#reply1186239
Jan Stejskal
verified
rating uzivatele
(7 hodnocení)
30. 3. 2016 13:17:31
Napsal Hasil Petr;1280821
Jenom to ne. Cron nesmí spouštět sám sebe. Vklákna by došla velice rychle a na web by se už nikdo nedostal. Je sice hezké, že se předchozí vlákno už ukončilo, ale každých 5, 10 minut se přidá další.
To záleží pouze na tom, jak se celá logika napíše. Teoreticky na to stačí pouze dvě vlákna.
30. 3. 2016 13:17:31
https://webtrh.cz/diskuse/jak-spustit-php-ulohu-v-cronu-kdyz-hosting-nepovoluje-dostatecny-timeout-pro-vykonani-cele-ulohy/#reply1186238
Pro odpověď se přihlašte.
Přihlásit