ProgressBar v PHP

Určitě už jste narazili na případ, kdy skript běží delší dobu a je vhodné o tom informovat uživatele. V opačném případě by mohl nabýt dojmu, že aplikace zamrzla a mohl by ji ukončit zavřením prohlížeče.


Při provádění dlouhotrvající operace narazíte na problém, kdy méně znalý uživatel neodhalí běžící skript v pozadí a jednoduše okno zavře. V takovém případě záleží, zda je proces vůbec proti takovému chování ošetřen, zda zrovna nespracovával nějaký důležitý soubor pro systém nebo neupravoval databázi a náhlé ukončení tak mohlo systém poškodit.

Je vhodné informovat uživatele o tom, v jaké části zpracování se skript nachází. Ne vždy je to možné. Já to využívám například při změně redesignu, kdy je potřeba převést všechny náhledy obrázků na novou velikost. Vím, není to operace častá, ale určitě najdete mnoho využití pro takový skript.

Ukazatel průběhu bychom mohli udělat dvěma způsoby. Prvním je při změně nějakého stavu překrýt původní text na stránce novým. Tento způsob je použit v mé ukázce. Druhým způsobem je napsat javascriptovou funkci, která by vždy změnila text na stránce. Později jsem přešel k překrývání, stávalo se, že javascript ne vždy se zachoval jak měl, ale je dost možné, že chyba bude jinde. Ať už použijeme jakoukoli metodu, je nutné, aby prohlížeč přijal data od serveru ještě před ukončením běhu skriptu.

Problémem je jak poslat klientovi (prohlížeči) data pokud skript stále běží

Od verze PHP 3 totiž klient přijímá data až po dokončení skriptu. Řešením je využití funkcí kontroly výstupu.

Setkávám se s častými otázkami na co jsou takové funkce a k čemu je použít. Já je používám, když odesílám mail, pro který mám vytvořenu šablonu mailu.

První použitou funkcí ve skriptu je ob_end_flush();, tu volám hned na začátku a oznamuji tím serveru, aby ukončil ukládání výstupu do paměti. Poté generuji html kód, který oznamuje změnu stavu prováděné operace a posílám na výstup prohlížeči dvojicí funkcí ob_flush(); (slouží k uvolnění obsahu paměti), a flush(); ta pošle data klientovi.

Pokud potřebujete oznamovat průběh nahrávání souborů na server, líbí se mi fancyupload. Nemám ho detailně vyzkoušen, takže uvítám zkušenosti a názory.

komentáře

RSS Komentáře k článku RSS Komentáře   Add to Google
15.06.2008 14:52 | Administrátor | jen pro upřesnění

fancyupload už mám detailně vyzkoušen, resp. jeho novou verzi simpleuploader, no a je perfektní, takže na nahrávání souborů na server vřele doporučuji…hlavní výhoda:konečně není uživatel vázán obvykle 30sekundovým limitem nahrávání souboru, což při běžných uploadech může být např. 500kb soubor, se simpleuploaderem můžete nahrávat i třeba 100mb soubory na server

20.02.2009 09:29 | Anonym (Tomas) | Re: jen pro upřesnění

Ahoj, prosim te, pises tu,ze ma jsi Fancyupload (v2.0) uz vyzkousel, me se to bohuzel porad nejak nedari rozbehnout na localu. Mohl by jsi mi prosim te nejak poradit, popripadne poslat primo jak to mas ty?. diky moc

20.02.2009 19:32 | Administrátor | Re: Re: jen pro upřesnění

mám to jak je to udělané na webu digitaraldu, zobraz si zdroj stránky, snad pochopíš, případně zkus zkontaktovat autora, bývá na icq, ovšem odpovídá jen na inteligentní dotazy, případně zkus kontaktovat mne mimo tuhle diskusi, kontakt jistě najdeš, ale času také není moc

21.06.2011 10:20 | Anonym () | Re: Re: jen pro upřesnění

khjkhjkhkj

Jméno
Název
Text
Lze používat Texy! syntax. Příklad syntaxe: "text odkazu":odkaz, **tučně**, *kurzíva*, `code`. PHP kód uzavírejte do <?php ... ?> a JavaScript do <script> ... </script>