我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

15年年末的时候,苏南大叔在微博上面发牢骚,说PHP不如NODEJS强悍,原因就是关于异步处理方面,PHP似乎不如天生异步的NODEJS更加有优势。一个比较常见的例子就是:注册用户发邮件。通过我们这些猿类的做法就是,调用mail函数发邮件,然后执行完毕,返回页面上面说发送成功。是不是大家都是这么做的?额,事实上,这个地方正确的姿势是:瞬间返回“发送成功”,而不是去等待两秒三秒去发邮件。

苏南大叔:PHP网页,如何异步执行后台进程? - php-sync
PHP网页,如何异步执行后台进程?(图1-1)

当时,我的认知上就是: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秒执行一次
    }
}
?>
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php