(本文于2010.10.01发表在《草根》杂志第四期,LAMP交流超级群(500人):106382633)
最近在考虑项目为用户群发邮件时想到了这个方法,觉得还有用,所以记录下来(项目情况是:用户要根据实际情况给他的客户发邮件,他的客户的数量是成千上万,根据情况选好客户,写好邮件点发送后要等着所有这些邮件发完不太现实,所以考虑后台运行),这个方法使用到的是HTTP的特性,先整理一下思路:
1.HTTP是无状态的
2.HTTP是请求-应答模式
3.HTTP是建立在TCP之上的(TCP建立在IP之上,每次请求浏览器都会使用一个随机的端口与服务器上的web端口(如80)建立socket连接,浏览器的随机端口可以通过$_SERVER查看到)
4.浏览器在请求一个web资源时(本文指PHP文件)会等待Web服务器的响应(本文中指Apache)直到响应结束
5.如果在等待的过程中用户点击了浏览器上的停止按钮,浏览器会关掉TCP连接,也就是中止当前的HTTP的请求-应答过程,根据对TCP的理解,这个中止应该是向服务器端发送了一条TCP指令
6.底层连接TCP断掉,当前未完成的响应当然也就输出不到浏览器上了
上面几条都好理解,但第4点还有细节:
web服务器的响应http头中有一个头信息:Connection 会告知浏览器连接的保持情况,一般情况下都是:
Connection:keep-alive
并且还有另外一个头说了要保持多久:Keep-Alive:300。
那如果服务器的响应中说连接已经关闭(connection: close)了会发生什么呢?浏览器会停止等待响应,(rfc 2616)
那现在如果用户请求的PHP输出HTTP头:Connection:close。并把这些头输出到浏览器,然后再继续执行后面的代码,会是什么效果呢?
反应到浏览器上就是页面请求完了,但是php并没有执行完,也就是将继续执行,这就实现了浏览器及所请求的php异步执行的效果
例子:
ob_end_clean();#清除之前的缓冲内容,这是必需的,如果之前的缓存不为空的话,里面可能有http头或者其它内容,导致后面的内容不能及时的输出
header("Connection: close");#告诉浏览器,连接关闭了,这样浏览器就不用等待服务器的响应
#可以发送200状态码,以这些请求是成功的,要不然可能浏览器会重试,特别是有代理的情况下
ob_start();#开发当前代码缓冲
//{{逻辑代码
echo "一些处理";
//逻辑代码}}
//下面输出http的一些头信息
$size=ob_get_length();
header("Content-Length: $size");
ob_end_flush();#输出当前缓冲
flush();#输出PHP缓冲
#休眠PHP,也就是当前PHP代码的执行停止,1秒钟后PHP被唤醒,
#PHP唤醒后,继续执行下面的代码,但这个时候上面代码的结果已经输出浏览器了,
#也就是浏览器从HTTP头中知道了服务端关闭了连接,浏览器将不在等待服务器的响应,
#反应给客户的就是页面不会显示处于加载状态中,换句话说用户可以关掉当前页面,或者关掉浏览器,
#PHP唤醒后继续执行下面的代码,这也就实现了PHP后台执行的效果,
#休眠的作用只是让php先把前面的输出作完,不要急于马上执行下面的代码,休息一下而已,也就是说下面的代码
#执行的时候前面的输出应该到达浏览器了
sleep(1);
echo '这里的输出用户看不到,后台运行的';
//下面代码的任何输出都不会输出给浏览器,因为http连接已经关了,
//所以下面的代码的执行属于后台运行的
set_time_limit(0);#不受时间限制
$f = fopen('1.txt','a+');
for($i=0;$i<1000;$i++){
if (fwrite($f,$i."
") === FALSE) {
echo "Cannot write to file ($filename)";
}
}
fclose($f);
其它情况:这种做法是让PHP主动告诉浏览器结束对话,这个过程应该是很快的,PHP收到请求后马上发送http给浏览器,但有时候的情况是PHP要先做一些事情,然后在把连接断掉的http响应返回给浏览器,但如果这个时候出现了网络或者其它一些意外情况导致了浏览器关掉了或者失去与服务器了连接了,PHP的响应头输出到不了浏览器上,PHP还会继续执行吗?
与浏览器作请求-应答这个过程的是Web服务器,如果请求的是PHP或者其它服务端语言,根据服务器的配置(loadmodule addtype这些)这些资源的请求会转到对应的语言处理器上,如所有的.php访问都会由PHP解析执行,并把执行的结果返回给 Apache,apache在返回给浏览器,但如果这些响应输出不到浏览器,apache会通知PHP,PHP就会中止当前请求文件的执行。
也就是说如果一个请求的过程中用户关掉了浏览器,或者点停止按钮的话,所请求的php代码可能就会只执行到一半,没有执行完,如果这个时候是在做一些数据库的写操作,数据就可能没有写完全。但也只是有输出的时候PHP才会收到客户端已经中止的通知,如果php没有任何的输出,就算浏览器关了,PHP代码也会完全执行完,那什么时候PHP会输出呢?通常PHP有一个输出缓冲,缓冲区满后就输出或者程序正常结束时也输出。
为什么有输出的时候PHP才知道浏览器是否是退出了,大概是因为Apache输出失败才反馈给PHP,如果没有输出,PHP就在一边默默的执行,Apache不通知它
在这种情况下如果PHP仍然要继续执行,可以使用PHP的一些连接控制函数来忽略客户端退出连接的情况:
ignore_user_abort,该函数表示客户端断掉后是否要中止PHP的执行。默认是中止
换句话说,在请求的过程中浏览器是否非正常退出PHP是可以知道的,可能通过connection_status()来得到连接状态:
0 – 正常
1 – 中止
2 – PHP执行超时
这三个状态可以叠加,也就是可以有 3 – 中止+PHP执行超时
问题是我们在什么时候调用connection_status()来得到连接的状态呢,在一般的代码中调用,得到的都是0,但如果浏览器中止了,php的执行也中止了,在一般的代码中这个函数不能很好的看到预期的结果,PHP提供了一个hook:register_shutdown_function该方法用于注册请求结束时的回调,不管请求是正常结束还是异常结束,只要PHP在执行这个回调是一定会调用到。可以在该方法中查看 connection_status()返回值,
function shutdown(){
$f = fopen('1.txt','a+');
fwrite($f,connection_status());
}
register_shutdown_function('shutdown');
while(1){
#如果注掉,用户点了停止,PHP也会执行到超时,文件1.txt中写入的是2 PHP执行超时
#如果不注掉,用户点了停止,文件1.txt中写入的是1 - 用户中止
echo ++$i."<br>";
}
分享到:
相关推荐
配置后台数据库,完成安装。 *提示:在此安装过程中会让你输入想创建的数据库名,如果你数据库是固定的话别,请 使用此数据库名,否则安装失败。 3.安装完毕后,请及时删除install.php文件,否则后果自负。 4....
文件夹`admin`可能是后台管理界面的代码,用于管理员执行诸如添加、删除和编辑用户等操作。在这里,PHP将发挥更重要的作用,因为它可能包含处理这些高级功能的脚本。管理员界面通常需要更高的安全性和权限控制,因此...
MySQL是一种关系型数据库管理系统(RDBMS),它以高效、稳定和开源著称,是许多Web应用的后台数据库选择。在这个项目中,开发者可能使用了PHP的MySQLi或PDO_MySQL扩展来与MySQL交互,执行查询、插入、更新和删除等...
标签中的"另类其它"可能指该脚本具有特定的定制化需求,"控件"可能涉及后台管理界面的交互设计,"源码"则强调了其开放性,允许用户根据自身需求进行修改,"资源"则表明X-Cart Gold提供了丰富的扩展资源。 综上所述...
25VV网址导航(www.25vv.com)系统是一套采用PHP MySQL(目前只支持MySQL数据库)方式运行的开源软件程序,安装时请确认您的空间支持IIS PHP Mysql或Apache PHP Mysql等运行环境,且PHP和Mysql版本匀为5.0X以上,或者...
【标题】"北京体育大学全站代码"涉及的是一个与网站开发相关的项目,可能是该大学官方网站或信息系统的一...通过对这些方面的研究,我们可以更全面地理解这个项目的实现方式,同时也能提升自身的编程和系统设计能力。
"源码"表明这个系统是开放源代码的,用户可以查看和修改其内部实现。"资源"则可能包括了数据库、视频文件等与系统运行相关的素材。 5. **压缩包子文件的文件名称列表**:毒爱影院 v1.0修正版、¶¾°®Ó°Ôº v...
3. **menm.php** 和 **fun.php**:这两个文件可能是处理菜单和功能模块的代码,menm.php可能用于生成网站的导航菜单,而fun.php则可能包含实现特定功能的函数。 4. **logo**:这是一个文件夹,很可能用于存储用户...
实现导出导入时运行超时则自动重新提交;修正导入密码个别特殊字符出错的BUG;添加设置导出导入一页时间间隔功能;使导出进度计算更准确;重新组织了源代码,使之更简洁;写了更详细的说明文档。 faisunSQL V3.5:...
标题“多用户网络收藏夹”指的是一个网络应用或者服务,它允许多个用户共享和管理他们的收藏链接。在互联网上,用户经常需要...其后台管理界面“admin.php”是整个系统中关键的一部分,用于维护和监控系统的正常运行。
《内容页面部署》是Xplus专有技术,内容一次发布,多次使用,前台后台完全独立,内容与站点架构独立。 操作系统 针对php的平台无关性的特点,XPlus可以运行于大多数的web server,例如免费的Apache,商业的...
这个模板可能是基于HTML、CSS、JavaScript等前端技术构建,可能还涉及到PHP或其他后端语言,以实现后台管理功能。用户可以通过简单的配置和编辑,快速打造出自己的在线平台。 描述中提到的“后台管理地址:admin/...
【标签】"另类其它"可能表明这个项目在电商领域中具有一定的独特性或者采用了非主流的实现方式。"另类"可能指设计风格、功能特性或者运营策略与众不同,而"其它"可能暗示这个商城系统涵盖了多种类型的商品或服务,...
1. 确保服务器环境支持PHP和MySQL,这是动网论坛运行的基础。 2. 安装前备份好原有的数据库和文件,以防意外情况导致数据丢失。 3. 安装过程中根据提示设置数据库连接信息,确保与服务器配置一致。 4. 管理员账号的...
这个资源可能包含了一个完整的网站系统,包括前端用户界面、后台管理系统以及支撑其运行的数据存储部分。 【描述】中的链接"http://www.artcn.net.cn"虽然没有直接指向"去遛遛笑话站",但可以推测该网站可能是提供...
- "另类其它"标签可能指的是Filebrowser与其他传统FTP客户端或文件管理系统相比,它提供了一种不同的交互方式和使用场景。 - 它可以作为一个独立的服务,也可以集成到网站后台,作为内容管理系统的一部分。 5. **...
(如果服务器提示,请注意所有php文件的上传方式为ASCII)。 3)在浏览器运行http://yoursite/skyarticle/install/按照提示进行安装,在安装过程中请不要刷新。 4)如果您完成了以上全部安装进程,那么恭喜您已经...
在phpmyadmin中运行下面的语句:ALTER TABLE `xionghuarong`.`ss_soft` CHANGE `Soft_img` `Soft_img` VARCHAR(120) NOT NULL 其中ss请替换为你所设置的数据表前缀!8-20:修正了FLASH无法批量生成分类的错误!更新...
在“另类其它”这个标签下,我们可以理解这个新闻系统可能具有某些非主流或创新性的特点,可能是独特的数据处理方式,或者是对传统新闻展示模式的一种颠覆。 总的来说,“惠信新闻系统首页(文本)全能调用代码”是一...