[Grafika] [WebTip] [Fotografování] [Galerie] [MujMac] [Printing]
  Redakce: info (at) builder.cz   Inzerce: reklama (at) grafika.cz
Diskuzní fóra
.Net (68471)
ASP (1591)
ActiveX (168)
Allegro (136)
Assembler (3926)
C++ Builder (23160)
C/C++ (44499)
Databáze (30680)
Delphi (78808)
DelphiX (1655)
DirectX (1464)
Java (39508)
JavaScript (12598)
Matematické programy (2178)
OOP a UML (732)
OpenGL (6920)
Php (65224)
PowerBuilder (464)
Problémy a algoritmy (10473)
Programování v Linuxu (2000)
Právo a programování (3384)
Python (1353)
Ruby (136)
Visual Basic (12078)
Visual C++ (12956)
Wap (56)
Web (10895)
Web servery (5549)
Win32 (13553)
Windows CE (865)
XML/XSL (1860)
Textová inzerce
Služby Builder.cz
  • Bazar - koupím(0)
  • Bazar - prodám(0)
  • Hledám práci(0)
  • Nabízíme práci(0)
  • Projekty(0)
  • Fork
    Tip pro php, jak rozdělit běh skriptu a tak umožnit složitější operace na pozadí..
    Autor: Podhajský Jan
    Rubrika: PHP
    Publikováno: 06.03. 2000
     Tisk článku
    Poslat odkaz emailem
     


    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:
    
    <?
    /* STOP tlacitko z prohlizece ignorujeme ..*/
    ignore_user_abort(1);
    
    /* timeout vypnut */
    set_time_limit(0);
    
    /* fork na jinou stranku */
    Header("Location: /nekam_jinam.html");
    Header("Connection: close\n\n");
    
    /* donutime jej poslat hlavicku.. */
    echo "neco";
    flush();
    /*** fork proveden */
    
    /* co se ma provadet dal .. */
    
    /* narocne vypocty :) */
    for($i=0; $i<3000000; $i++) {/* */};
    
    /* kontrola ze vse provedeno.. */	
    mail("cbob@builder.cz","test","TEST, i=$i");
    ?>
    
    

    Zpět na začátek stránky

    Podhajský Jan
    Autor je šéfredaktorem serveru Builder.cz

    Hodnocení článku
    1 | 2 | 3 | 4 | 5
    Aktuální známka: 2.57
    (Počet známek: 3164)

    Komentáře k článku
    Jakub Vrána12.12.14:39Skutečný fork
    Mara02.12.15:40nejde :-(
    Cool09.02.11:12Pekny
    Scrool21.05.14:12Fork a wml?
         





    info@builder.cz
    Vydává Grafika Publishing, s.r.o.
    Copyright (c) 1997-2002 Všechna práva vyhrazena