这两天须要给公司开发一个短信发送提醒的功能,一次批量发送几千条短信。
若是直接在后台循环执行虽然可行,可是前台操做用户就只能坐着空等,彻底看不到后台执行结果,因此考虑能不能有一种办法能够在php后台执行过程当中同时在前台显示后台执行任务进度呢。
可是这里遇到一个问题,通常状况下php都是在后台任务执行完毕后输出结果到浏览器,在执行过程不会给浏览器发送任何数据。这个时候想到了可使用php的flush函数,可使用flush函数在程序执行中强制输出;
尝试如下代码: javascript
<?php for($i= 1;$i<= 50;$i++) { ob_flush(); flush(); echo$i.'<br/>'; sleep(rand(0, 1)); } ?>
网上大都这样的例子,看代码应该会每隔一秒输出一个数字。可是你们实际测试下状况并不是如此,而是和没用flush同样,一次性输出1-50;
在这里请你们参考下鸟哥博客上的一篇文章http://www.laruence.com/2010/04/15/1414.html( 深刻理解ob_flush和flush的区别);
其中有一段话: php
有些Apache的模块,好比mod_gzip,可能本身进行输出缓存,这将致使flush()函数产生的结果不会当即被发送到客户端浏览器。 甚至浏览器也会在显示以前,缓存接收到的内容。例如 Netscape浏览器会在接受到换行或 html 标记的开头以前缓存内容,而且在接受到 </table> 标记以前,不会显示出整个表格。 一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节之后才开始显示该页面,因此必须发送一些额外的空格来让这 些浏览器显示页面内容。
因此找到问题所在了,不是由于flush没有起做用,而是服务器或者浏览器在内容不到必定的字节数(甚至是没有遇到html标记)一样会进行缓存,找到问题所在后尝试如下代码; css
<?php echostr_repeat("<b></br>",4096);//随便输出一段代码当即输出 for($i= 1;$i<= 50;$i++) { ob_flush(); flush(); echo$i.'<br/>'; sleep(rand(0, 1)); } ?>
已经能够将后台数据实时发送到前台了,而后有办法了吗?结合js,每次循环都输出一段js,去操做html节点;附上disucz中提出出来的安装进度代码供你们参考吧 html
<html xmlns="http://www.w3.org/1999/xhtml"><head> <meta content="text/html; charset=utf-8"http-equiv="Content-Type"> <title>Discuz! 安装向导</title> <style type="text/css"> body{ padding:5px 0; background:#FFF; text-align:center; } body, td, input, textarea, select, button{ color:#666; font:12px/1.5 Verdana, Tahoma, Arial,'Microsoft Yahei','Simsun', sans-serif; } .container{ overflow:hidden; margin:0 auto; width:700px; height:auto !important;text-align:left; border:1px solid #B5CFD9; } .main{ padding:20px 20px 0; background:#F7FBFE url(bg_repx.gif) repeat-x 0 -194px; } .main h3{ margin:10px auto; width:75%; color:#6CA1B4; font-weight:700; } #notice { overflow: hidden; margin: 20px; padding: 5px; height: 300px; border: 1px solid #B5CFD9; text-align: left; } </style> <meta name="Copyright"content="Comsenz Inc."> </head> <body><div> <div><script type="text/javascript"> functionshowmessage(message) { document.getElementById('notice').innerHTML += message +'<br/>'; document.getElementById('notice').scrollTop = 100000000; } </script> <div id="notice"></div> <?php //检测完成后显示的信息 functionshowjsmessage($message) { echo'<script type="text/javascript">showmessage(\''.addslashes($message).' \');</script>'."\r\n"; flush(); ob_flush(); } //模拟初始化数据表 for($i= 1;$i<= 50;$i++) { showjsmessage("创建数据表 {$i} ... 成功"); sleep(rand(0, 1)); } ?> </div> </div> </body> </html>