php curl 缓存请求_PHP异步非阻塞实现方法
点击蓝字关注我们!每天获取最新的编程小知识!
源 / 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异步非阻塞实现方法相关推荐
- 使用tornado让你的请求异步非阻塞
2019独角兽企业重金招聘Python工程师标准>>> 前言 也许有同学很迷惑:tornado不是标榜异步非阻塞解决10K问题的嘛?但是我却发现不是torando不好,而是你用错了. ...
- flask异步操作_Flask实现异步非阻塞请求功能实例解析
本文研究的主要是Flask实现异步非阻塞请求功能,具体实现如下. 最近做物联网项目的时候需要搭建一个异步非阻塞的HTTP服务器,经过查找资料,发现可以使用gevent包. 关于gevent Geven ...
- flask异步操作_Flask-Flask实现异步非阻塞请求功能
前言 最近做物联网项目的时候需要搭建一个异步非阻塞的HTTP服务器,经过查找资料,发现可以使用gevent包. 代码清单 下面放上代码清单,以后需要用到的时候直接移植即可. # coding=utf- ...
- 线程同步 阻塞 异步 非阻塞(转)
同步:函数没有执行完不返回,线程被挂起 阻塞:没有收完数据函数不返回,线程也被挂起 异步:函数立即返回,通过事件或是信号通知调用者 非阻塞:函数立即返回,通过select通知调用者 这样看来异步和非阻 ...
- mysql异步非阻塞方式_如何理解swoole异步非阻塞?
传统的apache2handler或php-fpm本质上都是短生命周期(请求后释放资源)的FastCGI运行模式. 请求来了,master进程会调用worker进程来处理,处理完后释放资源. 假设你在 ...
- java 异步_聊聊java高并发系统之异步非阻塞
作者:孙伟,目前负责京东商品详情页统一服务系统,写过java,写过ngx_lua,还写过storm等,喜欢学习研究新事物. 在做电商系统时,流量入口如首页.活动页.商品详情页等系统承载了网站的大部分流 ...
- 异步就是异步,根本就没有 异步非阻塞IO这个说法。阻塞 非阻塞,同步I/O 异步I/O 的区别
先给大家安利一下这个 https://www.ibm.com/developerworks/cn/linux/l-async/ 里面关于 异步非阻塞IO 是错的. 异步就是异步,别扯 异步阻塞 异步非 ...
- netty(异步非阻塞、实时、高效率)
1.为什么使用netty 简单,再也不用编写复杂的代码逻辑去实现通信,再也不用考虑性能问题,不需要考虑编解码问题,半包读写问题. netty运用于Hadoop的RPC框架Avro,JMS框架Rocke ...
- 真正的 Tornado 异步非阻塞
其中 Tornado 的定义是 Web 框架和异步网络库,其中他具备有异步非阻塞能力,能解决他两个框架请求阻塞的问题,在需要并发能力时候就应该使用 Tornado. 但是在实际使用过程中很容易把 To ...
- 处理大并发之一 对异步非阻塞的理解
处理大并发之一 对异步非阻塞的理解 在研究nginx和node.js的时候常会遇到异步.非阻塞等,之前自己也经常使用epoll,对其同步与阻塞,异步与非阻塞有了一定的认识,现对参考资料总结下. 首先讨 ...
最新文章
- 手工清理C:\windows\alg.exe病毒
- Linux文件特殊权限、FACL、sudo
- Android NDK
- mysql无法本地连接,本地连接腾讯云Mysql失败问题
- 【干货】机器学习中样本比例不平衡的处理方法
- 使用C#操作XML文件
- python——Tkinter图形化界面及threading多线程
- C#与C++在语言层面的区别(不断补充)
- java一个进程可以村多少个线程_一台 Java 服务器可以跑多少个线程?
- 修改html倒计时,利用自定义HTML小工具实现倒计时
- 使用Python3进行身份证号码标准验证
- 无人驾驶传感器融合系列(五)——毫米波雷达测速原理(77GHz FMCW)
- 副高级职称的要求真的很难达到吗?
- 计算机二级职业生涯规划讲座心得,职业规划课心得体会2000字
- java mqtt发布_使用kura或MQTT将消息发布到kapua
- mysql数据库熔断_服务熔断
- 织梦网站 mysql,织梦(DEDECMS)网站程序及数据库迁移搬家教程
- 服务器 硬盘 2.5改3.5,2.5寸将取代3.5寸硬盘
- Homework5_ch4 类和对象(3)
- php微信公众号发送红包功能