Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
PHP
Fork
6. března 2000, 00.00 | Tip pro php, jak rozdělit běh skriptu a tak umožnit složitější operace na pozadí..
Funkci fork znají především programátoři jazyka C. Efektem je vytvoření identické kopie běžícího procesu a je velmi hojně používána (např. pro spuštění jiného procesu, kdy se ´forknutý´ proces nahradí např.pomocí execve.)
Něco takového samozřejmě v php není možné. PHP je serverový skriptovací jazyk a jako takový je navržen co nejvíce interaktivně. Skript je prováděn dokud není u konce, uživatel jej neukončí nebo nevyprší timeout.
Co když potřebujeme vykonat nějakou časově náročnou operaci? Updatovat více položek v databázi, rozeslat emaily ap. Akce které uživatele jenž vyvolal stránku nezajímají..
Naštěstí existuje v php (od verze 3.0.7) několik rozšíření které umožnují práci na pozadí.
Prvním z nich je funkce set_time_limit() o které jsme již jednou psali. S její pomocí lze změnit nastavení timeoutu při zobrazování stránky (nastavení viz php.ini). Výsledkem je provedení náročné akce, ovšem uživatel musí čekat do konce a jím případně vyvolané přerušení vše ukončí. (nenulové číslo nastaví timeout, nula timeout vypne)
Druhou použitou funkcí je ignore_user_abort(). Ta zajistí ignoraci přerušení vyvolaného uživatelem. Resp. stránka se přestane natahovat, ale skript na straně serveru běží dál. (1 - zapne ignoraci, 0 - vypne, bez parametru - vrátí aktuální stav)
Dalo by se říci že již "máme vyhráno". Ne tak docela. Můžeme sice provádět časově náročné operace, ale stále na aktuální stránce kterou uživatel vidí. Zde potřebujeme onen "fork" pro přesunutí na pozadí.
O to se nám postará redirekt zaslaný v hlavičce dokumentu, který browser přesměruje na jinou stránku.
Praktická ukázka:
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007