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.问题得到解决!
  • 相关阅读:
    UVa 12174 (滑动窗口) Shuffle
    UVa 1607 (二分) Gates
    CodeForces ZeptoLab Code Rush 2015
    HDU 1525 (博弈) Euclid's Game
    HDU 2147 (博弈) kiki's game
    UVa 11093 Just Finish it up
    UVa 10954 (Huffman 优先队列) Add All
    CodeForces Round #298 Div.2
    UVa 12627 (递归 计数 找规律) Erratic Expansion
    UVa 714 (二分) Copying Books
  • 原文地址:https://www.cnblogs.com/jiangtian/p/8629863.html
Copyright © 2011-2022 走看看