PHP: Buffer preload (output buffering)
Občas nastane situace, kdy potřebujeme v PHP udělat například několik složitějších výpočtů, které budou trvat více serverového času, ale budeme chtít postupně uživateli vypisovat hotové informace a ne čekat až na dokončení skriptu. Můžeme si pomoci bufferem v PHP.
Pomocí správného použití bufferu v PHP můžete docílit toho, že budete uživateli vracet z webového serveru do prohlížeče zpracované informace a nebudete muset čekat až se vykoná celý skript, jak je tomu standardně.
Vezměme si například situaci, kdy je ve zdrojovém kódu opravdu složitý výpočet, jehož řešení trvá i několik sekund a tento výpočet se několikrát opakuje.
Pokud by uživatel takovou stránku načítal v prohlížeči, webový server by čekal na dokončení posledního výpočtu, a až potom by poslal výsledek na standardní výstup, tedy do prohlížeče.
Použitím bufferu můžeme vracet výsledek ihned po dokončení, jako je tomu na tomto příkladu, na kterém je použití jasné (pro pochopení situace doporučuji vyzkoušet):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//zapnuti bufferu ob_start(); $i = 1; do{ //slozity vypocet //pro demonstraci by bylo mozne pouzit funkci sleep $m = 0; for( $j = 1; $j < 1000000; $j++ ){ $m = $i/23/$j; } //vypis echo 'Result: ' . number_format( $m, 30, ',', ' ' ) . '<br />'; //odeslani bufferu na output ob_flush(); //odeslani do prohlizece flush(); }while( $i++ < 10 ); //odeslani dat a vypnuti bufferu ob_end_flush(); |
Výsledek v podobě výpisu:
1 2 3 4 5 6 7 8 9 10 |
Result: 0,000000043478304347869558554862 Result: 0,000000086956608695739117109724 Result: 0,000000130434913043608702309939 Result: 0,000000173913217391478251983017 Result: 0,000000217391521739347792774311 Result: 0,000000260869826087217404619878 Result: 0,000000304348130435086972056524 Result: 0,000000347826434782956495084250 Result: 0,000000391304739130826106929817 Result: 0,000000434783043478695585548621 |
bude vypisován vždy ihned po jeho vypočítání a nebude čekat až na dokončení posledního cyklu.
Nechces prosim udelat kompletni serial o PHP a MYSQL pro nas amatery .. prehledny s vysvetlenim … nikde na netu to neni a kdyz tak to neni zabezpecene .. uci napr. o pouzivani mysql_fetch_array o ktere se zas jinde pise, ze se nedoporucuje pouzivat 🙁 Pak v tom je hrozny chaoz a my ani nevime co se mame a co se nemame ucit 🙁
Myslim si ze by to bylo zbytecne, protoze serialu o PHP je na celem, i ceskem, internetu opravdu hodne.
Napriklad tva poznamka o mysql_fetch_array:
Existuje vice moznosti jak pristupovat k datum z databaze, a casem prijdes sam na to, kdy je lepsi pouzit to a kdy zase ono.
Funkci pro pristup je vice, od zakladniho mysql_result, prez mysql_fetch_array, ktere samo o sobe ma tri typy vraceni vysledku (MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH) az napriklad po mysql_fetch_object.
Sam casem poznas co je kdy lepsi pouzit a vetsinou si zvyknes na jednu z nich, kterou potom s oblibou pouzivas (v mem pripade je to vetsinou mysql_fetch_object).
Amateri jste oba dva, profesionalove uzivaji abstraktni layer nad databazi, aby se pristupovalo k db pres unifikovane API, coz je aktualne v pripade PHP PDO, o kterem samozrejme oba vite asi tolik, kolik ja o vysivani 😀
Tak diky za poznamku.
Moje odpoved se tykala primo jeho dotazu, asi tolik.
A o vysivani neco vim.