zoukankan      html  css  js  c++  java
  • php实现异步请求

    PHP开启异步多线程执行脚本

     装载自:http://www.cnblogs.com/clphp/p/4913214.html

    场景要求

    客户端调用服务器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
    [php] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /**  
    2.      * 单个CURL调用超时限制   
    3.      */    
    4.     public $curlopt_timeout = 1;    
    5.     private $param = array();    

    但是这样做就违背了curl本身的逻辑限制。
     

    方案二

    利用socket
    在a.php中加入以下代码
    [php] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. $fp = fsockopen("test.com", 80, $errno, $errstr, 30);  
    2. if (!$fp){  
    3.     echo 'error fsockopen';  
    4. }  
    5. else{  
    6.     stream_set_blocking($fp,0);  
    7.     $http = "GET /test/b.php HTTP/1.1 ";      
    8.     $http .= "Host: test.com ";      
    9.     $http .= "Connection: Close ";  
    10.     fwrite($fp,$http);  
    11.     fclose($fp);  
    12. }  
    即可实现a.php调用b.php无阻塞。
    代码中stream_set_blocking函数用来设定socket链接为无阻塞方式(默认为阻塞)。
     

    问题

    在使用方案二以后,遇到了一个问题,即客户端短时间内多次调用a.php,出现部分请求 没有执行b.php 的情况。
    解决方法:
    在Nginx的nginx.conf文件中,查看worker_processes为1,判断服务端响应请求的线程启动限制太大,得知服务器本身配置为双核CPU,判断2-4线程比较合适,于是修改worker_processes为4.问题得到解决!
  • 相关阅读:
    工具:统计jQuery中各字符串出现次数
    读Ext之八(原生事件对象的修复及扩充)
    querySelector和getElementById通过id获取元素的区别
    读Ext之十(解析JSON)
    Safari/Chrome中placeholder属性实现不完整
    读Ext之十一(通过innerHTML创建元素)
    各浏览器中innerHTML实现差异(2)
    读Ext之五(Dom的低级封装)
    读Ext之十二(在各个位置插入元素)
    读Ext之四(事件的低级封装)
  • 原文地址:https://www.cnblogs.com/jiangtian/p/8629863.html
Copyright © 2011-2022 走看看