1 / 32

Output Buffering Control with php

Output Buffering Control with php. By Tim LeClair Senior Web Developer, Skills Gatekey Corporation. Who is this presentation for?. Web Developers / Programmers Output buffering is a unique tool that allows for creative ways to make things happen and provide more options.

shaman
Download Presentation

Output Buffering Control with php

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Output Buffering Controlwith php By Tim LeClair Senior Web Developer, Skills Gatekey Corporation

  2. Who is this presentation for? • Web Developers / ProgrammersOutput buffering is a unique tool that allows for creative ways to make things happen and provide more options. • Web Designers IT Project managersWeb Designers, It Managers, in creating better websites, understanding an overview of the powers that web technologies provide will allow you to create to your fullest extent. • Owners of websites that push / plan to push the limitsBefore you expand hardware wise, it is important to tweak your website’s efficiency prior or your cost and complexity will multiply quickly. • Knowledge to help Intelligence create something new

  3. Why use Output Buffers? Lesson objectives • More control • More speed • Less bandwidth • Less Database connections • Reduce redundant script execution • Put your html in a file or variable • Tune / manipulate your output Gains in one can equal loss in another!

  4. Output Control Functions Initialize / Functions / Exiting • ob_start(callback function) Turn on output buffering • output_add_rewrite_varWill also turn on the output buffer

  5. Output Control Functions Initialize / Functions / Exiting • ob_end_clean Clean (erase) the output buffer and turn off output buffering • ob_end_flushFlush (send) the output buffer and turn off output buffering • ob_get_cleanGet current buffer contents and delete current output buffer • ob_get_flush Flush the output buffer, return it as a string and turn off output buffering

  6. Output Control Functions Initialize / Functions / Exiting • ob_flushFlush (send) the output buffer • ob_cleanClean (erase) the output buffer • ob_get_contentsReturn the contents of the output buffer • ob_implicit_flushTurn implicit flush on/off • flushFlush the output buffer

  7. Output Control Functions Initialize / Functions / Exiting • ob_get_length Return the length of the output buffer • ob_get_level Return the nesting level of the output buffering mechanism • ob_get_status Get status of output buffers • ob_list_handlers List all output handlers in use • output_add_rewrite_var Add URL rewriter values • output_reset_rewrite_vars Reset URL rewriter values • ob_iconv_handler() Convert character encoding as output buffer handler • ob_tidyhandler() ob_start callback function to repair the buffer (requires libtidy installation)

  8. Compression options This is not a lesson on compression but need to know to prevent conflict. • Web server Levelmod_deflate (apache 2)mod_gzip • Apache.conf • .htaccess • Script level • Zlib.output.compression • Output buffer function gzhandler • Php.ini • Php script Remember rule: compressing twice is a bad thing!

  9. Gzip and Output Buffers • ob_start(“ob_gzhandler”) requires the zlibextension. • You cannot use both ob_gzhandler and zlib.output compression. • Gzip + Gzip + unGzip = TRASH • Differenceshttp://www.php.net/manual/en/function.ob-gzhandler.php#30159 • Website tester for compression at:http://www.seoconsultants.com/tools/compression.asp

  10. Zlib extension • Zlib support in PHP is not enabled by default. You will need to configure PHP • The Windows version of PHP has built-in support for this extension. You do not need to load any additional extensions in order to use these functions.Note: Built-in support for zlib on Windows is available with PHP 4.3.0. phpinfo(); XAMPP for Linux The distribution for Linux systems (tested for SuSE, RedHat, Mandrake and Debian) contains: Apache, MySQL, PHP & PEAR, Perl, ProFTPD, phpMyAdmin, OpenSSL, GD, Freetype2, libjpeg, libpng, gdbm, zlib, expat, Sablotron, libxml, Ming, Webalizer, pdf class, ncurses, mod_perl, FreeTDS, gettext, mcrypt, mhash, eAccelerator, SQLite and IMAP C-Client. XAMPP for Windows The distribution for Windows 98, NT, 2000, 2003, XP and Vista. This version contains: Apache, MySQL, PHP + PEAR, Perl, mod_php, mod_perl, mod_ssl, OpenSSL, phpMyAdmin, Webalizer, Mercury Mail Transport System for Win32 and NetWare Systems v3.32, Ming, JpGraph, FileZilla FTP Server, mcrypt, eAccelerator, SQLite, and WEB-DAV + mod_auth_mysql.

  11. HTTP compression • Most content is cached by the user’s browser. Dynamic content in the HTML code is not cacheable as it changes, so HTTP compression can lessen the bandwidth and time to 1/3 to 1/5 easily. That is a big savings! Yslow On Firefox with Firebug Twitter SmartSniff http://www.nirsoft.net Without compression With compression

  12. Getting Started Using callback functions • <?php • ob_start() ; • // rest of your code • ?> • <?php • ob_start("ob_gzhandler"); • // rest of your code • ?>

  13. Exiting output buffers Easiest way • Just let the script end ! Almost as easy Flush to lower buffer level and end current level <?php • // rest of your code • ob_end_flush(); • ?>Erase and end current buffer level • <?php • // rest of your code • ob_end_clean(); • ?> • <?php • // rest of your code • $ob = ob_get_flush(); • ?> • <?php • // rest of your code • $ob = ob_get_clean(); • ?>

  14. Buffer Levels If(cache.php )readfile(cache.php)else Level 4 Ob_start20 Db calls BLOG Ob_start(ob_tidyhandler) cache.php Level 4 Ob_start(4heckofit) Bottom Ob_start(condense) Level 3 Level 3 LeftAds Right MenuAdvertisement Tidy it up Ob_start(ob_gzhandler) Level 2 Top Remove junk Level 1 Header Compression Server LeftAds Header Top Right MenuAdvertisement BLOG Bottom Output to Browser

  15. Project 1a - Output buffering <?php // top of index.php ob_start(); // the rest of your website ob_end_flush(); ?>

  16. Project 2a – Nesting <?php ob_start(); echo"1"; ob_start(); echo"2"; $s1 = ob_get_contents(); ob_start(); echo"3"; $s2 = ob_get_contents(); ob_end_flush(); ob_end_clean(); echo"4"; ob_start(); echo"5"; ob_end_flush(); echo$s1; ob_end_flush(); ?> Answer = 1452

  17. Project 2b – Nesting <?php ob_start(); echo"1"; ob_start(); echo"2"; $s1 = ob_get_contents(); ob_flush(); ob_start(); echo"3"; $s2 = ob_get_contents(); ob_end_flush(); ob_end_clean(); echo"4"; ob_start(); echo"5"; ob_end_flush(); echo$s1; ob_end_flush(); ?> Answer = 12452

  18. Project 2c – Nesting <?php ob_start(); echo"1"; ob_start(); echo"2"; $s1 = ob_get_contents(); ob_flush(); ob_start(); echo"3"; $s2 = ob_get_contents(); ob_flush(); ob_end_flush(); ob_flush(); ob_end_clean(); echo"4"; ob_start(); echo"5"; ob_end_flush(); echo$s1.$s2; ob_flush(); echo"7"; ob_end_clean(); ?> Answer = 1234523

  19. Project 3a – Other functions <?php ob_start(); ob_start(); echoob_get_length().'- length<br>'; echoob_get_level().'- level<br>'; echoob_get_length().'- length<br>'; ob_end_flush(); echoob_get_level().'- level<br>'; ob_end_flush(); ?> 0- length2- level25- length1- level Level 0 = no buffer

  20. Project 3b – Other functions <?php ob_start(); ob_start(“ob_tidyhandler”); echo'<br>'; echo'<br>'; $s = ob_get_status(true); print_r($s); ob_end_flush(); ob_end_flush(); ?> Array ( [0] => Array ( [chunk_size] => 0 [size] => 40960 [block_size] => 10240 [type] => 1 [status] => 0 [name] => default output handler [del] => 1 ) [1] => Array ( [chunk_size] => 0 [size] => 40960 [block_size] => 10240 [type] => 1 [status] => 0 [name] => ob_tidyhandler output handler [del] => 1 ) )

  21. Project 3c – Other functions <?php ob_start("ob_gzhandler"); ob_start(“condense”); ob_start('ob_tidyhandler'); ob_start(); $s = ob_list_handlers(); print_r($s); ob_end_flush(); ob_end_flush(); ob_end_flush(); ob_end_flush(); ?> Array ( [0] => ob_gzhandler [1] => ob_tidyhandler [2] => default output handler )

  22. Project 4a – Output to file <?php ob_start("ob_gzhandler"); // dynamic content // check database if page has been modified $cachefile = $_SERVER['DOCUMENT_ROOT']."/cache/cache09.php"; if($pagemodified != 'Y' && file_exists($cachefile)){ readfile($cachefile); } else{ // content to be cached $fp = fopen($cachefile, 'w'); fwrite($fp, ob_get_contents()); @chmod($fp,0755); } // more dynamic content ob_end_flush() ?>

  23. Project 4b – Cache file system <?php $cacheFile = 'cache.html'; if ( (file_exists($cacheFile)) && ((fileatime($cacheFile) + 600) > time()) ) { $content = file_get_contents($cacheFile); echo$content; } else { ob_start(); // write content echo'What Ever You Want!'; $content = ob_get_clean(); file_put_contents($cacheFile,$content); echo$content; } ?>

  24. Project 5 – rewrite variable <?php output_add_rewrite_var('var', 'value'); echo'<a href="file.php">link</a> <a href="http://example.com">link2</a>'; echo'<form action="script.php" method="post"> <input type="text" name="var2" /> </form><br>'; print_r(ob_list_handlers()); ob_end_flush(); output_reset_rewrite_vars(); echo'<br><a href="file.php">link</a> <a href="http://example.com">link2</a>'; echo'<form action="script.php" method="post"> <input type="text" name="var2" /> </form><br>'; print_r(ob_list_handlers()); ?> <a href="file.php?var=value">link</a> <a href="http://example.com">link2</a> <form action="script.php" method="post"><input type="hidden" name="var" value="value" />

  25. Project 6 – Less HTML less readable <?php functioncondense($buffer){ // change new lines and tabs to single spaces $buffer = str_replace(array("\r\n", "\r", "\n", "\t"), ' ',$buffer); // multispaces to single... $buffer = ereg_replace(" {2,}", ' ',$buffer); // remove single spaces between tags $buffer = str_replace("> <", "><", $buffer); // remove single spaces around &nbsp; $buffer = str_replace(" &nbsp;", "&nbsp;", $buffer); $buffer = str_replace("&nbsp; ", "&nbsp;", $buffer); return$buffer; } ob_start(" condense"); // your website ob_end_flush(); ?> Can Be Very Costly

  26. Project 7 – Tidyhandler <?php ob_start('ob_tidyhandler'); echo'<p>test</i>'; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN"> <html> <head> <title></title> </head> <body> <p>test</p> </body> </html> Uncomment in php.ini 4 xampp ;extension=php_sybase_ct.dll ;extension=php_threads.dll extension=php_tidy.dll ;extension=php_timezonedb.dll ;extension=php_translit.dll http://ditio.net/2008/01/03/is-your-html-code-tidy/

  27. Project 8 – Compression level <?php ini_set('zlib.output_compression_level', 8); ob_start("ob_gzhandler"); // html ob_end_flush(); ?>

  28. Bug reports • http://bugs.php.net/ • Search terms like “ob_start” • Output buffers can effect the whole document, so it is wise to test all aspects of your website for functionality and with various browsers.

  29. WIMP issues This lecture was written with Apache as the example server. If you are using IIS then it is recommended to look closely at how IIS handles buffers and compression. • Example:ORIGINAL <add name="php" path="*.php" verb="*" modules="IsapiModule" scriptProcessor="C:\Program Files\PHP\php5isapi.dll" resourceType="Unspecified"  /> CHANGE <add name="php" path="*.php" verb="*" modules="IsapiModule" scriptProcessor="C:\Program Files\PHP\php5isapi.dll" resourceType="Unspecified" responseBufferLimit="0" /> You MUST add responseBufferLimit="0“ By default, IIS buffers everything up to a massive 4MB

  30. Summary Did lesson meet its intended objectives • More control • More speed • Less bandwidth • Less MySQL connections • Reduce redundant script execution • Put your html in a file or variable • Tune your output

  31. Questions Sorry, we do not answer questions If you come across this document online, please refer to www.php.net or use a search engine to find your answers. Else if you catch me standing in front of you, then I will do my best to answer your questions.

  32. The End • Acknowledgments: • Rasmus Lerdorf creator of PHP • Mehdi Achour, Friedhelm Betz, Antony Dovgal, Nuno Lopes, Hannes Magnusson, Georg Richter, Damien Seguy and Jakub Vrana noted active contributors of PHP

More Related