PHP开启异步多线程执行脚本
2013-11-27 10:40
363 查看
场景要求
客户端调用服务器a.php接口,需要执行一个长达5s-20s不等的耗资源操作,但是客户端响应请求时间为5秒(微信公众账号服务器请求响应超时时间),5s以上无回复即断开连接。解决设想
客户端调用a.php之后,a.php执行异步多线程操作调用b.php,a.php调用成功后即刻反馈给客户端回执,b.php自动执行耗资源操作。难点
PHP没有真正实现多线程操作的方法。所以需要通过其它手段来进行模拟多线程。方案一
利用CURL非阻塞调用b.php,实现过程可以参考 http://blog.csdn.net/linvo/article/details/5956629但是有一个问题,就是a.php会继续等待b.php的响应。
于是临时想了一个解决方案:
在此处代码中,将$curlopt_timeout改为1
/** * 单个CURL调用超时限制 */ public $curlopt_timeout = 1; private $param = array();
但是这样做就违背了curl本身的逻辑限制。
方案二
利用socket在a.php中加入以下代码
$fp = fsockopen("test.com", 80, $errno, $errstr, 30); if (!$fp){ echo 'error fsockopen'; } else{ stream_set_blocking($fp,0); $http = "GET /test/b.php HTTP/1.1\r\n"; $http .= "Host: test.com\r\n"; $http .= "Connection: Close\r\n\r\n"; fwrite($fp,$http); fclose($fp); }即可实现a.php调用b.php无阻塞。
代码中stream_set_blocking函数用来设定socket链接为无阻塞方式(默认为阻塞)。
问题
在使用方案二以后,遇到了一个问题,即客户端短时间内多次调用a.php,出现部分请求 没有执行b.php 的情况。解决方法:
在Nginx的nginx.conf文件中,查看worker_processes为1,判断服务端响应请求的线程启动限制太大,得知服务器本身配置为双核CPU,判断2-4线程比较合适,于是修改worker_processes为4.问题得到解决!
相关文章推荐
- PHP异步执行后台的脚本命令
- PHP语言实现脚本异步执行
- PHP 异步执行方法,模拟多线程的应用分析
- php 异步执行脚本
- 多线程异步执行脚本
- PHP 异步执行方法,模拟多线程的应用分析
- php 异步执行脚本
- PHP 异步执行方法,模拟多线程
- PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)
- 使用crontab定时任务执行sh脚本实现tomcat实时监控(监控内容为当tomcat关闭时开启tomcat)
- PHP 脚本后台执行
- PHP中实现异步调用多线程程序代码
- PHP不支持多线程,有时候处理问题不是那么爽,今天谈论一下PHP定时执行的方法
- 命令行下 执行 带参数的php脚本 方法
- win7计划任务定时执行PHP脚本设置图解
- linux使用crondtab定时执行php脚本文件
- 定时执行php脚本
- PHP 异步调用 后台调用 持续执行 断开连接/浏览器
- windows下使用PHP实现定时执行脚本
- linux 定时执行php脚本