Autor | Zpráva | ||
---|---|---|---|
Musilda Profil |
#1 · Zasláno: 7. 9. 2015, 11:33:55
Zdravím
potřeboval bych poradit s přerušením scriptu, před vypršením time limitu. Na hostingu bohužel nelze upravit a chci zamezit tomu, aby se script přerušil v polovině procesu. Zkoušel jsem pomocí microtime počítat zbývající čas, ale to zřejmě nefunguje správně. Díky za každou pomoc. |
||
Alphard Profil |
#2 · Zasláno: 7. 9. 2015, 11:42:48
Musilda:
„Zkoušel jsem pomocí microtime počítat zbývající čas, ale to zřejmě nefunguje správně.“ Zkuste to znovu, nebo se podělte o ten script, tohle by mělo fungovat. Párkrát jsem to použil, jen mi teda vystačil time(), nechával jsem několik sekund v záloze, na miliontiny jsem to opravdu nepočítal. |
||
Musilda Profil |
#3 · Zasláno: 7. 9. 2015, 11:56:25
Děkuji za potvrzení správnosti postupu. Podívám se ještě, zda tam nemám chybu.
Script sem raději dávat nebudu, protože to je taková fuj pracovní patlanina. |
||
Chro. Profil |
#4 · Zasláno: 7. 9. 2015, 12:12:26
Samotné počítání času nestačí, ne? Je třeba vytvořit podmínku, předpokládám uvnitř cyklu, s konstrukcí exit, případně break.
|
||
Musilda Profil |
#5 · Zasláno: 7. 9. 2015, 12:33:48
Chro.:
To tam samozřejmě mám. Včetně toho, že počáteční čas je mimo cyklus. |
||
Alphard Profil |
#6 · Zasláno: 7. 9. 2015, 12:34:58
To jsem považoval za samozřejmé. Stejně jako to, že elementární operace musí být dostatečně rychlá vzhledem k limitu.
$limit = 25; // tady už počítám s rezervou, jestli je limit 30 s, píši 25 $start = time(); foreach ($data as $key => $line) { // tady iteruje přes data, typicky import nějakého katalogu, zpracování jednoho řádku většinou trvá zlomek sekundy, ale mohou jich být stovky tisíc // tady je to zpracování if ($start + $limit < time()) { // blíží se limit, je třeba přerušit zpracování saveCurrentLine($key); // tady se bude příště pokračovat break; // přeruší se cyklus } } |
||
Chro. Profil |
#7 · Zasláno: 7. 9. 2015, 12:43:48
Pak je možná chyba v zápisu microtime:
microtime() vrací string "msec sec" a pozdější početní operace s takovým formátem bude dávat jiný výsledek, než microtime(TRUE), toto vrací float. |
||
Musilda Profil |
#8 · Zasláno: 7. 9. 2015, 12:47:59
Chro.:
No, tak to bylo ono. S TRUE to už šlape, díky. |
||
Časová prodleva: 20 dní
|
|||
Musilda Profil |
#9 · Zasláno: 27. 9. 2015, 09:21:24
Vracím se k této otázce, protože se to týká stále stejného problému.
Script se mi přeruší s hlášením Maximum execution time of 90 seconds exceeded. Pokud ale vypisuji naměřený čas v průběhu scriptu, tak se dostanu na maximálně 12 vteřin. Jak je možné? Počítá se prozní čas scriptu jinak, než reálný čas? |
||
Davex Profil |
Musilda:
„Pokud ale vypisuji naměřený čas v průběhu scriptu, tak se dostanu na maximálně 12 vteřin. Jak je možné?“ Nemůže se skript zaseknout někde mezi měřením času (nekonečná smyčka, čekání na odemčení DB apod.)? „Počítá se prozní čas scriptu jinak, než reálný čas?“ Ne, microtime() vrací počet sekund od 1.1.1970 0:00:00.00 v daném okamžiku.
Pokud měla otázka znít „Může se lišit maximum execution time a doba běhu scriptu? “, tak ano, na Linuxu může být doba běhu skriptu delší, protože do „maximum execution time“ se počítá pouze reálně spotřebovaný procesorový čas (user + system) a nezahrnuje dobu čekání na jiné zdroje jako např. DB. |
||
Časová prodleva: 9 let
|
0