- Rongsen.Com.Cn 版权所有 2008-2010 京ICP备08007000号 京公海网安备11010802026356号 朝阳网安编号:110105199号
- 北京黑客防线网安工作室-黑客防线网安服务器维护基地为您提供专业的服务器维护,企业网站维护,网站维护服务
- (建议采用1024×768分辨率,以达到最佳视觉效果) Powered by 黑客防线网安 ©2009-2010 www.rongsen.com.cn
 
  
    
| 作者:黑客防线网安PHP维护基地 来源:黑客防线网安PHP维护基地 浏览次数:0 | 
    传统的B/S结构的应用程序,都是采用"客户端拉"结束来实现客户端和服务器端的数据交换。 
    本文将通过结合Ticks(可以参看我的另外一篇文章:关于PHP你可能不知道的-PHP的事件驱动化设计 ),来实现一个服务器推的PHP聊天室简单构想。 
PHPer,尤其是用过set_cookie, header的,一定见过这样的提示信息:"Warning: Cannot modify header information - headers already sent by.....", 这是因为通过HTTP协议通信,数据包会包含俩个部分,一个是Header,一个是data。一般来说,都是先Header部分,在Heaer部分指明了Data部分的长度,然后使用 来表示header部分结束,接下来是Data部分。
  当我们有任何输出的时候,Header部分就发送了,这个时候,你再想header函数来改变一些Header部分的域信息,就会得到上面的提示信息。 
    
   一个简单的办法就是使用output_buffering。让它来缓存服务器的输出,不要太早将Header部分发给客户端。 
那么,如果不使用output_buffering,是不是就可以实现,每当服务器有输出,就立即发送给客户端呢?
做个如下试验://设置php.ini中output_buffering=0 或者使用ob_end_flush()关闭缓存
set_time_limit(0); 
for($i=0;$i<10;$i++){ 
  echo "Now Index is :". $i; 
  sleep(1); 
} 
  结果我们发现,还是要等到脚本全部执行完以后,才能一次看到所有的结果。。 
  为什么呢? 
  这是因为我们只是解决了缓存问题,但是还有一个缓冲问题,PHP会缓冲程序的输出。所以,这个时候,我们还需要调用,flush(), 来强制使得PHP将所有的程序输出发送给客户端。//设置php.ini中output_buffering=0 
ob_end_flush();//关闭缓存 
set_time_limit(0); 
for($i=0;$i<10;$i++){ 
  echo "Now Index is :". $i; 
  flush(); 
  sleep(1); 
} 
    现在是不是看到了,不断有服务器的数据显示出来? 
    有几个概念之间的关系,我这里补充以下: 
    在代码中使用ob_start(), 就相当于在php.ini中使用output_buffering=on一样,使用服务器缓存。 
    在代码中使用ob_end_flush() 就相当于在php.ini中使用output_buffering = false一样,关闭服务器缓存。 
     
     基于前面的讨论,我们就有可能使用Ticks来实现,一个无刷新,无ajax的聊天室: 页面中包含俩个iframe,一个是不断获取聊天室的聊天内容,一个包含用户发表聊天内容的form. 这样,在第一个frame的脚本中: 
ob_end_clear();//关闭缓存 
set_time_limit(0); 
ob_implicit_flush(); //这个语句将强制每当有输出就自动刷新,相当于在每个echo后,调用flush() 
$new_mesg = NULL; 
register_tick_function("getNewMesg"); 
declare(ticks=1){ 
  while(1){ 
     if(!is_null($new_mesg)){ 
          foreach($new_mesg as $msg){ 
&nbs
| 我要申请本站:N点 | 黑客防线官网 | | 
| 专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479 |