Autor Zpráva
Musilda
Profil
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
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
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
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
Chro.:
To tam samozřejmě mám. Včetně toho, že počáteční čas je mimo cyklus.
Alphard
Profil
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
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
Chro.:
No, tak to bylo ono. S TRUE to už šlape, díky.
Musilda
Profil
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: