PHP实现前台同步显示后台任务进度
一次批量发送几千条短信。 如果直接在后台循环执行虽然可行,但是前台操作用户就只能坐着空等,完全看不到后台执行结果,所以考虑能不能有一种办法可以在php后台执行过程中同时在前台显示后台执行任务进度呢。 但是这里遇到一个问题,一般情况下php都是在后台任务执行完毕后输出结果到浏览器,在执行过程不会给浏览器发送任何数据。这个时候想到了可以使用php的flush函数,可以使用flush函数在程序执行中强制输出; 尝试以下代码:
| 1 2 3 4 5 6 7 8 | <?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的区别); 其中有一段话:
有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。 甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。 一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这
些浏览器显示页面内容。
所以找到问题所在了,不是因为flush没有起作用,而是服务器或者浏览器在内容不到一定的字节数(甚至是没有遇到html标记)同样会进行缓存,找到问题所在后尝试以下代码;
| 1 2 3 4 5 6 7 8 9 | <?php echo str_repeat("<b></br>",4096); //随便输出一段代码立即输出 for ($i = 1; $i <= 50; $i++) { ob_flush(); flush(); echo $i.'<br/>'; sleep(rand(0, 1)); } ?> | 
已经可以将后台数据实时发送到前台了,然后有办法了吗?结合js,每次循环都输出一段js,去操作html节点;附上disucz中提出出来的安装进度代码供大家参考吧
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <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"> function showmessage(message) {     document.getElementById('notice').innerHTML += message + '<br/>';     document.getElementById('notice').scrollTop = 100000000; } </script>         <div id="notice"></div> <?php //检测完成后显示的信息 function showjsmessage($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> | 
PHP实现前台同步显示后台任务进度的更多相关文章
- 背水一战 Windows 10 (116) - 后台任务: 前台程序激活后台任务
		[源码下载] 背水一战 Windows 10 (116) - 后台任务: 前台程序激活后台任务 作者:webabcd 介绍背水一战 Windows 10 之 后台任务 前台程序激活后台任务 示例演示后 ... 
- Android中如何下载文件并显示下载进度
		原文地址:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1125/2057.html 这里主要讨论三种方式:AsyncTask.Serv ... 
- SharePoint 2013技巧分享系列 - Active Directory同步显示用户照片
		为了保持通讯信息的一致性,需要设置SharePoint,Exchange, Lync等信息同步更新显示,例如,员工头像信息. 本文介绍如何在SharePoint 2013中同步显示Active Dir ... 
- miniui前台无法显示数据
		坑爹,刚开始使用miniui重写对账单的功能,显示数据的时候明明已经获取到json数据了,但前台还是显示不出来,找了一上午的原因,终于找到是因为前台显示字段的field值要改成和json中(数据库字段 ... 
- asp.net MVC SignalR 与数据库 实时同步显示
		asp.net MVC SignalR 与数据库 实时同步显示 错误:未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持.如果希望使用通知,请为此数据库启用 ... 
- 解决magento添加产品在前台不显示问题
		有时候我们在magento系统添加产品,前台不显示,最模板分析可能 以下几个原因: 1 添加新品要重新index一下,magento是静态的.html页面,不reindex不出来的.在System→I ... 
- Android开发之文件下载,状态时显示下载进度,点击自动安装
		在进行软件升级时,需要进行文件下载,在这里实现自定义的文件下载,并在状态栏显示下载进度,下载完成后,点击触发安装. 效果如图: 用于下载文件和显示现在进度的线程类如下: [java] view pl ... 
- oracle查询查询出某字段为空后前台不显示的小测试1
		1.nvl(,''),后台会打印null,前台不显示 2不处理,后台显示null,前台不显示 3.nvl(,' '),后台显示" ",前台显示“ ” 
- JS中同步显示并分割输入的数字字符串
		题目比较晦涩,来张图来说明要表达的效果: 第一张图的效果就是,用户输入一个数字,上面就显示一个大层,然后显示输入的数字,并把数字用空格按照每四位分割出来.好像在建行的网上银行上面就有这种效果.第二个图 ... 
随机推荐
- COM组件入门(一)
			近期须要用到COM组件的知识,看了看COM编程指南,感觉还不错.把我的学习心得记录下来.这是我依据教程写的demo StopWatch接口实现部分,接口部分我的项目是动态库,主要源代码例如以下: 完整 ... 
- C# String.Format
			C 货币 string.Format("{0:C3}", 2) $2.000 D 十进制 string.Format("{0:D3}", 2) 002 E 科学 ... 
- 课本[Teb]软件设计
			中文名:课本 英文名:Textbook 简称:Teb 一个专注于分享校内课件的软件. 一个课件的整合平台. 发布平台:web>android>ios; 主要功能:预览课件(暂定),搜索课件 ... 
- poj 1845(等比数列前n项和及高速幂)
			Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 13959 Accepted: 3433 Descripti ... 
- oc-25- @property @synthesize
			s.h #import <Foundation/Foundation.h> @interface Student : NSObject { @public NSString *_name; ... 
- Soft Renderer的乐趣
			最近这一个月的闲暇时间在边学习<3D编程大师技巧>边做自己的Soft Renderer,一个月下来总算有了个“基本原型”的样子.主要是在编写图形管线的过程式代码,简单明了为第一个阶段的目标 ... 
- gpus_ReturnGuiltyForHardwareRestart 错误
			经查出是glScissor长宽不能为0,在某些设备上会出问题 
- POJ1651:Multiplication Puzzle(区间DP)
			Description The multiplication puzzle is played with a row of cards, each containing a single positi ... 
- structs 2 学习总结(一)
			转发请注明出处 1.页面传值. 传值 前台 <s:form action="login1">//action 名字 需要在structs配置 用户<s:tex ... 
- SolrEntityProcessor
			SolrEntityProcessor从不同的solr实例和内核中引入数据,这个数据是基于指定的或者是过滤的查询来获取到的.如果你需要复制索引,并且小幅度的修改目标索引文件中的数据,那么可以使用Sol ... 
