PHP网页,如何异步执行后台进程?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
15年年末的时候,苏南大叔在微博上面发牢骚,说PHP不如NODEJS强悍,原因就是关于异步处理方面,PHP似乎不如天生异步的NODEJS更加有优势。一个比较常见的例子就是:注册用户发邮件。通过我们这些猿类的做法就是,调用mail函数发邮件,然后执行完毕,返回页面上面说发送成功。是不是大家都是这么做的?额,事实上,这个地方正确的姿势是:瞬间返回“发送成功”,而不是去等待两秒三秒去发邮件。
当时,我的认知上就是:PHP不能做到这点。写了多半年NODEJS后,就被NODE的这个天生异步的特性,折腾的死去活来的。发现很多人也对它这特性是即恨又痛。好吧,后来专门出来了个co.js用于强制去掉异步特性。
测试代码
今天写着写着PHP,又想起这事来了。于是试了试,还真心打脸啊。PHP也可以做到,瞬间返回客户端HTML,而不必等待耗时程序的执行完毕。好吧,下面是我的测试代码。大家可以自己看看。
<?php
ob_end_clean(); //清除之前的缓冲内容
header("Connection: close"); //告诉浏览器,连接关闭了,这样浏览器就不用等待服务器的响应
header("HTTP/1.1 200 OK"); //可以发送200状态码,以这些请求是成功的,要不然可能浏览器会重试
ob_start(); //开始当前代码缓冲
echo "running,,,,.";
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); //输出当前缓冲
flush();
sleep(1);
ignore_user_abort(true); //后台运行,这个只是运行浏览器关闭,并不是直接就中止返回200状态。
set_time_limit(0); //取消脚本运行时间的超时上限
rundata();
function rundata()
{
$cnt = 0;
while (1) {
$cnt++;
if ($cnt > 5) {
break;
}
$fp = fopen('time_task.txt', "a+");
$str = @date("Y-m-d h:i:s") . "\n\r";
fwrite($fp, $str);
fclose($fp);
sleep(5); //5秒执行一次
}
}
?>
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。