Output buffering control with php
This presentation is the property of its rightful owner.
Sponsored Links
1 / 32

Output Buffering Control with php PowerPoint PPT Presentation


  • 91 Views
  • Uploaded on
  • Presentation posted in: General

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.

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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Output buffering control with php

Output Buffering Controlwith php

By Tim LeClair

Senior Web Developer, Skills Gatekey Corporation


Who is this presentation for

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


Why use output buffers

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!


Output control functions

Output Control Functions

Initialize / Functions / Exiting

  • ob_start(callback function) Turn on output buffering

  • output_add_rewrite_varWill also turn on the output buffer


Output control functions1

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


Output control functions2

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


Output control functions3

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)


Compression options

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!


Gzip and output buffers

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


Zlib extension

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.


Http compression

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


Using callback functions

Getting Started

Using callback functions

  • <?php

  • ob_start() ;

  • // rest of your code

  • ?>

  • <?php

  • ob_start("ob_gzhandler");

  • // rest of your code

  • ?>


Exiting output buffers

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();

  • ?>


Buffer levels

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


Project 1a output buffering

Project 1a - Output buffering

<?php

// top of index.php

ob_start();

// the rest of your website

ob_end_flush();

?>


Project 2a nesting

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


Project 2b nesting

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


Project 2c nesting

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


Project 3a other functions

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


Project 3b other functions

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 )

)


Project 3c other functions

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 )


Project 4a output to file

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()

?>


Project 4b cache file system

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;

}

?>


Project 5 rewrite variable

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" />


Project 6 less html less readable

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


Project 7 tidyhandler

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/


Project 8 compression level

Project 8 – Compression level

<?php

ini_set('zlib.output_compression_level', 8);

ob_start("ob_gzhandler");

// html

ob_end_flush();

?>


Bug reports

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.


Wimp issues

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


Summary

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


Questions

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.


The end

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


  • Login