<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## 場景要求 客戶端調用服務器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.問題得到解決! ``` 報錯:stream_set_blocking() expects parameter 1 to be resource, null given 解決方法,修改php.ini函數設置,找到 disable_functions = 將proc_open和stream_socket_server兩個參數刪除 重啟php ``` 完整代碼: ``` /** * @parem $url 網頁地址 http://www.test.com/test/test.php * @parem $port 網址端口 默認80 * @parem $t 腳本請求時間 默認30s * @parem $method 請求方式 get/post * @parem $data ['test'=>'1'] * */ public function asyncPHP($url, $port = 80, $t = 30, $method = 'get', $data = null) { $info = parse_url($url); $fp = fsockopen($info["host"], $port, $errno, $errstr, $t); //stream_set_blocking函數用來設定socket鏈接為無阻塞方式 stream_set_blocking($fp, 0); // 判斷是否有數據 if (isset($data) && !empty($data)) { $query = http_build_query($data); // 數組轉url 字符串形式 } else { $query = null; } // 判斷 請求方式 if ($method == 'post') { $head = "POST " . $info['path'] . " HTTP/1.0" . PHP_EOL; } else { $head = "GET " . $info['path'] . "?" . $query . " HTTP/1.0" . PHP_EOL; } $head .= "Host: " . $info['host'] . PHP_EOL; // 請求主機地址 $head .= "Referer: " . $url . PHP_EOL; if (isset($data) && !empty($data) && ($method == 'post')) { $head .= "Content-type: application/x-www-form-urlencoded" . PHP_EOL; $head .= "Content-Length: " . strlen(trim($query)) . PHP_EOL; $head .= PHP_EOL; $head .= trim($query); } else { $head .= PHP_EOL; } fwrite($fp, $head); fclose($fp); } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看