点击蓝字关注我们!每天获取最新的编程小知识!

源 / php中文网      源 / www.php.cn

为让 PHP 在后端处理长时间任务时不阻塞,快速响应页面请求,可以有如下措施:

(查看原文请点击本文末尾左下角:

1.使用 fastcgi_finish_request()

如果 PHP 与 Web 服务器使用了 PHP-FPM(FastCGI 进程管理器),那通过 fastcgi_finish_request() 函数能马上结束会话,而 PHP 线程可以继续在后台运行。

echo "program start...";

file_put_contents('log.txt','start-time:'.date('Y-m-d H:i:s'), FILE_APPEND);

fastcgi_finish_request();

sleep(1);

echo 'debug...';

file_put_contents('log.txt', 'start-proceed:'.date('Y-m-d H:i:s'), FILE_APPEND);

sleep(10);

file_put_contents('log.txt', 'end-time:'.date('Y-m-d H:i:s'), FILE_APPEND);

从输出结果可看到,页面打印完program start...,输出第一行到 log.txt 后会话就返回了,所以后面的 debug... 不会在浏览器上显示,而 log.txt 文件能完整地接收到三个完成时间。

2.使用 fsockopen()

使用 fsockopen() 打开一个网络连接或者一个Unix套接字连接,再用 stream_set_blocking() 非阻塞模式请求:

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);

if (!$fp) {

    die('error fsockopen');

}

// 转换到非阻塞模式

stream_set_blocking($fp, 0);

$http = "GET /save.php  / HTTP/1.1\r\n";

$http .= "Host: www.example.com\r\n";

$http .= "Connection: Close\r\n\r\n";

fwrite($fp, $http);

fclose($fp);

3.使用 cURL

利用cURL中的 curl_multi_* 函数发送异步请求

$mh = curl_multi_init();

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://localhost/");

curl_multi_add_handle($mh, $ch);

curl_multi_exec($mh, $active);

curl_close($ch);

curl_multi_remove_handle($mh, $ch);

curl_multi_close($mh);

echo "End\n";

4.使用 Gearman/Swoole 扩展

Gearman 是一个具有 php 扩展的分布式异步处理框架,能处理大批量异步任务。

Swoole 最近很火,有很多异步方法,使用简单。

5.使用缓存和队列

使用redis等缓存、队列,将数据写入缓存,使用后台计划任务实现数据异步处理。

这个方法在常见的大流量架构中应该很常见吧

6.调用系统命令

极端的情况下,可以调用系统命令,可以将数据传给后台任务执行,个人感觉不是很高效。

$cmd = 'nohup php ./processd.php $someVar >/dev/null  &';

`$cmd`

7.使用 pcntl_fork()

安装 pcntl 扩展,使用 pcntl_fork() 生成子进程异步执行任务,个人觉得是最方便的,但也容易出现僵尸进程。

$pid = pcntl_fork()

if ($pid == 0) {

    child_func();    //子进程函数,主进程运行

} else {

    father_func();   //主进程函数

}

echo "Process " . getmypid() . " get to the end.\n";

function father_func() {

    echo "Father pid is " . getmypid() . "\n";

}

function child_func() {

    sleep(6);

    echo "Child process exit pid is " . getmypid() . "\n";

    exit(0);

}

php curl 缓存请求_PHP异步非阻塞实现方法相关推荐

  1. 使用tornado让你的请求异步非阻塞

    2019独角兽企业重金招聘Python工程师标准>>> 前言 也许有同学很迷惑:tornado不是标榜异步非阻塞解决10K问题的嘛?但是我却发现不是torando不好,而是你用错了. ...

  2. flask异步操作_Flask实现异步非阻塞请求功能实例解析

    本文研究的主要是Flask实现异步非阻塞请求功能,具体实现如下. 最近做物联网项目的时候需要搭建一个异步非阻塞的HTTP服务器,经过查找资料,发现可以使用gevent包. 关于gevent Geven ...

  3. flask异步操作_Flask-Flask实现异步非阻塞请求功能

    前言 最近做物联网项目的时候需要搭建一个异步非阻塞的HTTP服务器,经过查找资料,发现可以使用gevent包. 代码清单 下面放上代码清单,以后需要用到的时候直接移植即可. # coding=utf- ...

  4. 线程同步 阻塞 异步 非阻塞(转)

    同步:函数没有执行完不返回,线程被挂起 阻塞:没有收完数据函数不返回,线程也被挂起 异步:函数立即返回,通过事件或是信号通知调用者 非阻塞:函数立即返回,通过select通知调用者 这样看来异步和非阻 ...

  5. mysql异步非阻塞方式_如何理解swoole异步非阻塞?

    传统的apache2handler或php-fpm本质上都是短生命周期(请求后释放资源)的FastCGI运行模式. 请求来了,master进程会调用worker进程来处理,处理完后释放资源. 假设你在 ...

  6. java 异步_聊聊java高并发系统之异步非阻塞

    作者:孙伟,目前负责京东商品详情页统一服务系统,写过java,写过ngx_lua,还写过storm等,喜欢学习研究新事物. 在做电商系统时,流量入口如首页.活动页.商品详情页等系统承载了网站的大部分流 ...

  7. 异步就是异步,根本就没有 异步非阻塞IO这个说法。阻塞 非阻塞,同步I/O 异步I/O 的区别

    先给大家安利一下这个 https://www.ibm.com/developerworks/cn/linux/l-async/ 里面关于 异步非阻塞IO 是错的. 异步就是异步,别扯 异步阻塞 异步非 ...

  8. netty(异步非阻塞、实时、高效率)

    1.为什么使用netty 简单,再也不用编写复杂的代码逻辑去实现通信,再也不用考虑性能问题,不需要考虑编解码问题,半包读写问题. netty运用于Hadoop的RPC框架Avro,JMS框架Rocke ...

  9. 真正的 Tornado 异步非阻塞

    其中 Tornado 的定义是 Web 框架和异步网络库,其中他具备有异步非阻塞能力,能解决他两个框架请求阻塞的问题,在需要并发能力时候就应该使用 Tornado. 但是在实际使用过程中很容易把 To ...

  10. 处理大并发之一 对异步非阻塞的理解

    处理大并发之一 对异步非阻塞的理解 在研究nginx和node.js的时候常会遇到异步.非阻塞等,之前自己也经常使用epoll,对其同步与阻塞,异步与非阻塞有了一定的认识,现对参考资料总结下. 首先讨 ...

最新文章

  1. 手工清理C:\windows\alg.exe病毒
  2. Linux文件特殊权限、FACL、sudo
  3. Android NDK
  4. mysql无法本地连接,本地连接腾讯云Mysql失败问题
  5. 【干货】机器学习中样本比例不平衡的处理方法
  6. 使用C#操作XML文件
  7. python——Tkinter图形化界面及threading多线程
  8. C#与C++在语言层面的区别(不断补充)
  9. java一个进程可以村多少个线程_一台 Java 服务器可以跑多少个线程?
  10. 修改html倒计时,利用自定义HTML小工具实现倒计时
  11. 使用Python3进行身份证号码标准验证
  12. 无人驾驶传感器融合系列(五)——毫米波雷达测速原理(77GHz FMCW)
  13. 副高级职称的要求真的很难达到吗?
  14. 计算机二级职业生涯规划讲座心得,职业规划课心得体会2000字
  15. java mqtt发布_使用kura或MQTT将消息发布到kapua
  16. mysql数据库熔断_服务熔断
  17. 织梦网站 mysql,织梦(DEDECMS)网站程序及数据库迁移搬家教程
  18. 服务器 硬盘 2.5改3.5,2.5寸将取代3.5寸硬盘
  19. Homework5_ch4 类和对象(3)
  20. php微信公众号发送红包功能

热门文章

  1. session依赖cookie,如果浏览器禁用了cookie呢?
  2. 如何才能写好代码,做到以下几点即可
  3. C# ManualResetEvent和AutoResetEvent 使用笔记
  4. Solaris10 swap空间管理
  5. Wireshark系列之7 利用WinHex还原文件
  6. Android -- TabHost
  7. PHP配置问题(找不到指定模块)解决办法
  8. 微信小程序/js上传图片值腾讯云cos
  9. 2019年初,我收到人生中的第一笔稿费
  10. iview 级联选择组件_iView Cascader级联选择器