PHP max_execution_time un Apache timeout
Šodien nācās kārtējo reizi izzināt to, ko nekad līdz šim nav nācies. Ir ņekijs PHP skripts, kurš tiek izsaukts webiski. Tam ir jāizpildās nenoteiktu laiku. Ko mēs parasti darām? Vai nu konfigurējam max_execution_time
INI mainīgo, vai arī izmantojam set_time_limit(0)
. Izrādās, ka tas vēl nav viss. Skipts anyway izbeidzās pēc 45 sekundēm. Ilgi raku.
Izrādās, ka Apache konfigurācijā ir mainīgais timeout
, kurš vairāk vai mazāk brutāli nokauj attiecīgo procesu, ja tas karājas un, apačprāt, neko nedara ilgāk nekā iekš minētā mainīgā minēto laiku.
Risinājums, kā izrādās, ir vienkāršs. Apache procesu par taimautojušos uzskata tad, ja tas neko nekur nesūta un nesaņem. Pietiek reizi noteiktā laikā (bet ne retāk kā iekš timeout
norādītajā) izsniegt apacim pa baitiņam (kaut vai punktiņus zīmēt vai <br style="display: none;"/>
sūtīt), lai tas domātu, ka viss aizvien vēl notiek.
Ja nu kādam noder. Protams, zinu, ka šādus webiski izpildāmus ilgstošus skriptus taisīt nav pareizi. Bet dažreiz sanāk.
BlackHalt
2006. gada 16. novembrī, plkst. 12:25
Redzkā šie abi nedraudzējas. Tas takā var saprast, apachim vajag kaut kādu nebūt autputu tai laikā?
laacz Autors
2006. gada 16. novembrī, plkst. 12:27
BH: y
BlackHalt
2006. gada 16. novembrī, plkst. 12:28
Varbūt var slepeno papildus header nosuutiit. To arii neredz.
laacz Autors
2006. gada 16. novembrī, plkst. 12:31
BH: Teorētiski var. Nebiju iedomājies.
haa
2006. gada 16. novembrī, plkst. 13:05
īstenībā tieši vakar saskāros ar šo jautājumu. bija jāpalaiž konvertācijas skripts - uzliku time limit uz 0 un outputu... tagad domāju, ka redz cik labi, ka pieliku outputu, jo būtu sēdējis un prātojis, kāpēc killojas pēc 45sec :)
Sm
2006. gada 16. novembrī, plkst. 13:08
A kapēc tas skripts nevarētu sūtīt kautko uz to pašu serveri?
BlackHalt
2006. gada 16. novembrī, plkst. 14:05
Kā tas ir
sūtīt kautko uz to pašu serveri?
?Krišs
2006. gada 16. novembrī, plkst. 17:14
Man jau liktos dikti patīkami, ja ilgi izpildāms process reportētu par to, kā viņam iet. Vienalga, vai tas pavērts no pārlūkprogrammas vai konsolē (tad gan laikam apache tur ne-pri-chom) ... informēšana par statusu ir LABI :-)
archaic
2006. gada 16. novembrī, plkst. 18:37
Bet informēšana par statusu prasa resursus. Kaut gan - ļoti maz ir tādu uzdevumu, kur tam ir kāda nozīme.
a
2006. gada 17. novembrī, plkst. 09:48
keep-alive option in httpd headers
noisex
2006. gada 17. novembrī, plkst. 12:15
a kapec ne shelliski tiek laists?
BigUgga
2006. gada 17. novembrī, plkst. 14:37
ar šitādu fīču/gļuku arī reiz saskāros. risinājums tieši tāds pats :)
noisex: reizēm tā vajag :)
Kirils
2006. gada 18. novembrī, plkst. 22:05
shelliskaa palaishana izteeree vairaak papildus atminjas, nekaa caur apachi, kur php modulis jau ir ielaadeets.
sn
2006. gada 20. novembrī, plkst. 18:01
http://lv2.php.net/manual/en/function.apache-reset-timeout.php
laacz Autors
2006. gada 20. novembrī, plkst. 18:49
sn: Kāpēc "lv2"? :)