如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留链接信息。

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秒执行一次
    }
}
?>

 【源码】代码片段及相关软件点此获取

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

本站的忠实读者小伙伴,正在阅读下面这些文章:

欢迎转载传播本篇原创文章,转载请保留链接及作者信息。
欢迎指正文字或逻辑错误,将会择优在文末列出您的信息。
本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
未经许可,规模化镜像抄袭本站内容的行为,将会根据有关法律法规进行维权。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。

苏南大叔需要你的支持

感谢您的打赏,让我更有动力,将更多精彩教程文章,呈现给大家!谢谢!