Output Buffering Control with PHP
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Output Buffering Control with PHP

  • 9,127 views
Uploaded on

PHP Output Buffering offers various means to control the resources that are needed to present a website to the browser. Output buffering, like any tool in a programmers pouch adds more options to......

PHP Output Buffering offers various means to control the resources that are needed to present a website to the browser. Output buffering, like any tool in a programmers pouch adds more options to create great things.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
9,127
On Slideshare
9,114
From Embeds
13
Number of Embeds
1

Actions

Shares
Downloads
28
Comments
0
Likes
3

Embeds 13

http://www.slideshare.net 13

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Output Buffering Control with php By Tim LeClair Senior Web Developer, Skills Gatekey Corporation
  • 2. 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.
    • Web Designers IT Project managers Web 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 limits Before 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?
    • 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
    Lesson objectives Gains in one can equal loss in another!
  • 4. Output Control Functions
    • ob_start(callback function) Turn on output buffering
    Initialize / Functions / Exiting
    • output_add_rewrite_var Will also turn on the output buffer
  • 5. Output Control Functions
    • ob_end_clean Clean (erase) the output buffer and turn off output buffering
    • ob_end_flush Flush (send) the output buffer and turn off output buffering
    • ob_get_clean Get 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
    Initialize / Functions / Exiting
  • 6. Output Control Functions
    • ob_flush Flush (send) the output buffer
    • ob_clean Clean (erase) the output buffer
    • ob_get_contents Return the contents of the output buffer
    • ob_implicit_flush Turn implicit flush on/off
    • flush Flush the output buffer
    Initialize / Functions / Exiting
  • 7. Output Control Functions
    • 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)
    Initialize / Functions / Exiting
  • 8. Compression options
    • Web server Level mod_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! This is not a lesson on compression but need to know to prevent conflict.
  • 9. Gzip and Output Buffers
    • ob_start(“ob_gzhandler”) requires the zlib extension.
    • You cannot use both ob_gzhandler and zlib.output compression.
    • Gzip + Gzip + unGzip = TRASH
    • Differences http://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.
    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. phpinfo();
  • 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 SmartSniff http://www.nirsoft.net Without compression Twitter With compression
  • 12. Using callback functions
    • <?php
    • ob_start(&quot;ob_gzhandler&quot;);
    • // rest of your code
    • ?>
    Getting Started
    • <?php
    • ob_start() ;
    • // rest of your code
    • ?>
  • 13. Exiting output buffers
    • Just let the script end !
    Easiest way
    • 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();
    • ?>
    Almost as easy
    • <?php
    • // rest of your code
    • $ob = ob_get_flush();
    • ?>
    • <?php
    • // rest of your code
    • $ob = ob_get_clean();
    • ?>
  • 14. Buffer Levels Level 1 Level 2 Level 3 Level 4 Server Level 3 Output to Browser Ob_start (ob_gzhandler) Ob_start (condense) Ob_start (ob_tidyhandler) Ob_start 20 Db calls cache.php If (cache.php ) readfile(cache.php) else Level 4 Tidy it up Remove junk Compression Ob_start (4heckofit) Header Top Right Menu Advertisement Left Ads BLOG Header Top Right Menu Advertisement BLOG Left Ads Bottom Bottom
  • 15. Project 1a - Output buffering <?php // top of index.php ob_start (); // the rest of your website ob_end_flush (); ?>
  • 16. Project 2a – Nesting 1452 Answer = <?php ob_start (); echo &quot;1&quot; ; ob_start (); echo &quot;2&quot; ; $s1 = ob_get_contents (); ob_start (); echo &quot;3&quot; ; $s2 = ob_get_contents (); ob_end_flush (); ob_end_clean (); echo &quot;4&quot; ; ob_start (); echo &quot;5&quot; ; ob_end_flush (); echo $s1 ; ob_end_flush (); ?>
  • 17. Project 2b – Nesting 12452 Answer = <?php ob_start (); echo &quot;1&quot; ; ob_start (); echo &quot;2&quot; ; $s1 = ob_get_contents (); ob_flush (); ob_start (); echo &quot;3&quot; ; $s2 = ob_get_contents (); ob_end_flush (); ob_end_clean (); echo &quot;4&quot; ; ob_start (); echo &quot;5&quot; ; ob_end_flush (); echo $s1 ; ob_end_flush (); ?>
  • 18. Project 2c – Nesting 1234523 Answer = <?php ob_start (); echo &quot;1&quot; ; ob_start (); echo &quot;2&quot; ; $s1 = ob_get_contents (); ob_flush (); ob_start (); echo &quot;3&quot; ; $s2 = ob_get_contents (); ob_flush (); ob_end_flush (); ob_flush (); ob_end_clean (); echo &quot;4&quot; ; ob_start (); echo &quot;5&quot; ; ob_end_flush (); echo $s1 . $s2 ; ob_flush (); echo &quot;7&quot; ; ob_end_clean (); ?>
  • 19. Project 3a – Other functions <?php ob_start (); ob_start (); echo ob_get_length () . '- length<br>' ; echo ob_get_level () . '- level<br>' ; echo ob_get_length () . '- length<br>' ; ob_end_flush (); echo ob_get_level () . '- level<br>' ; ob_end_flush (); ?> 0- length 2- level 25- length 1- 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 ( &quot;ob_gzhandler&quot; ); 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 ( &quot;ob_gzhandler&quot; ); // dynamic content // check database if page has been modified $cachefile = $_SERVER [ 'DOCUMENT_ROOT' ]. &quot;/cache/cache09.php&quot; ; 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 ); ob_end_flush () } // 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=&quot;file.php&quot;>link</a> <a href=&quot;http://example.com&quot;>link2</a>' ; echo '<form action=&quot;script.php&quot; method=&quot;post&quot;> <input type=&quot;text&quot; name=&quot;var2&quot; /> </form><br>' ; print_r ( ob_list_handlers ()); ob_end_flush (); output_reset_rewrite_vars (); echo '<br><a href=&quot;file.php&quot;>link</a> <a href=&quot;http://example.com&quot;>link2</a>' ; echo '<form action=&quot;script.php&quot; method=&quot;post&quot;> <input type=&quot;text&quot; name=&quot;var2&quot; /> </form><br>' ; print_r ( ob_list_handlers ()); ?> <a href=&quot;file.php?var=value&quot;>link</a> <a href=&quot;http://example.com&quot;>link2</a> <form action=&quot;script.php&quot; method=&quot;post&quot;><input type=&quot;hidden&quot; name=&quot;var&quot; value=&quot;value&quot; />
  • 25. Project 6 – Less HTML less readable <?php function condense ( $buffer ){ // change new lines and tabs to single spaces $buffer = str_replace ( array ( &quot; &quot; , &quot; &quot; , &quot; &quot; , &quot; &quot; ), ' ' , $buffer ); // multispaces to single... $buffer = ereg_replace ( &quot; {2,}&quot; , ' ' , $buffer ); // remove single spaces between tags $buffer = str_replace ( &quot;> <&quot; , &quot;><&quot; , $buffer ); // remove single spaces around &nbsp; $buffer = str_replace ( &quot; &nbsp;&quot; , &quot;&nbsp;&quot; , $buffer ); $buffer = str_replace ( &quot;&nbsp; &quot; , &quot;&nbsp;&quot; , $buffer ); return $buffer ; } ob_start ( &quot; condense &quot; ); // 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 &quot;-//W3C//DTD HTML 3.2//EN&quot;> <html> <head> <title></title> </head> <body> <p> test </p> </body> </html> http://ditio.net/2008/01/03/is-your-html-code-tidy/ 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
  • 27. Project 8 – Compression level <?php ini_set ( 'zlib.output_compression_level' , 8 ); ob_start ( &quot;ob_gzhandler&quot; ); // 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
    • Example: ORIGINAL <add name=&quot;php&quot; path=&quot;*.php&quot; verb=&quot;*&quot; modules=&quot;IsapiModule&quot; scriptProcessor=&quot;C:Program FilesPHPphp5isapi.dll&quot; resourceType=&quot;Unspecified&quot;  /> CHANGE <add name=&quot;php&quot; path=&quot;*.php&quot; verb=&quot;*&quot; modules=&quot;IsapiModule&quot; scriptProcessor=&quot;C:Program FilesPHPphp5isapi.dll&quot; resourceType=&quot;Unspecified&quot; responseBufferLimit=&quot;0&quot; /> You MUST add responseBufferLimit=&quot;0“ By default, IIS buffers everything up to a massive 4MB
    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.
  • 30. Summary
    • More control
    • More speed
    • Less bandwidth
    • Less MySQL connections
    • Reduce redundant script execution
    • Put your html in a file or variable
    • Tune your output
    Did lesson meet its intended objectives
  • 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