場景要求
客戶端調用服務器a.php接口,需要執行一個長達5s-20s不等的耗資源操作,但是客戶端響應請求時間爲5秒(微信公衆賬號服務器請求響應超時時間),5s以上無回覆即斷開連接。
解決設想
客戶端調用a.php之後,a.php執行異步多線程操作調用b.php,a.php調用成功後即刻反饋給客戶端回執,b.php自動執行耗資源操作。
難點
PHP沒有真正實現多線程操作的方法。所以需要通過其它手段來進行模擬多線程。
方案一
/**
* 單個CURL調用超時限制
*/
public $curlopt_timeout = 1;
private $param = array();
但是這樣做就違背了curl本身的邏輯限制。
方案二
$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無阻塞。