This is a simple iframe-based PHP Comet example. Additional work must be done to be able to build up and tear-down connections, but the effect is solid. This is a quick and dirty method without having to use heavy feature detection to determine if xhr readystate 3 is available.
References:
Even Faster Web Sites by Steve Souders
http://www.zeitoun.net/articles/comet_and_php/start
http://cometdaily.com/2007/11/18/ie-activexhtmlfile-transport-part-ii/
frontEnd.html:
<html> <head> <title>Comet demo</title> <style type="text/css"> .hiddenIframe { position:absolute; top:0px; left:0px; display:block; z-index:-999; visibility:hidden; } </style> </head> <body> <div id="content">The server time will be shown here</div> <script type="text/javascript"> var content = document.getElementById('content'); var dumpText = function(text){ content.innerHTML = content.innerHTML + '<BR>'+ text; } </script> <iframe src="backEnd.php" class="hiddenIframe"></iframe> </body> </html> |
backEnd.php
<?php /* Simple COMET script tested to work with IE6, IE8, IE9, Chrome 5, Chrome 10, Firefox 3.6.16, Firefox 4, Safari 5, Opera 11 */ header("Cache-Control: no-cache, must-revalidate"); header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); //Turn of Apache output compression // Necessary if you have gzip setup in your httpd.conf (e.g. LoadModule deflate_module modules/mod_deflate.so) apache_setenv('no-gzip', 1); ini_set('zlib.output_compression', 0); //Disable all PHP output buffering ini_set('output_buffering', 'Off'); ini_set('implicit_flush', 1); ob_implicit_flush(1); for ($i = 0, $level = ob_get_level(); $i < $level; $i++) { ob_end_flush(); } //Flush all levels of the buffer to start error_reporting(E_ALL); ?><html> <head> <title>Comet php backend</title> </head> <body> <script type="text/javascript"> var dumpText = window.parent.dumpText; </script> <?php $startTime = time(); $maxLoopTime = 10; while(time()-$startTime < $maxLoopTime) { echo '<script type="text/javascript">'; echo "dumpText(".time().');'.str_repeat(' ',500); //500 characters of padding echo "</script>\r\n"; flush(); $randSleep = mt_rand(100000, 2000000); //sleep between 100 ms and 2 seconds usleep($randSleep); } ?> <script type="text/javascript">dumpText("Output Finished");</script> </body> </html> |
Comments
Leave a comment Trackback