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.
Zdrojový kód je ke stažení zde a ukázka zde. V příkladu byl použit zdrojový kód z článku Zjištění zabrané paměti php skriptem ve Windows.
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
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



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