在一個php指令碼中觸發另一個耗時很長的php指令碼,不想等待,怎麼做?curl去觸發需要加個逾時,如果逾時設定短了失敗率很高(網路不穩),長了也很耗時,只是相對時間少一點,fsockopen去觸發需要加個延時(sleep(*)),都要留時間給網路傳輸資料,不是特別好,有其他解決方案嗎?
(必須在伺服器端)
回複內容:
在一個php指令碼中觸發另一個耗時很長的php指令碼,不想等待,怎麼做?curl去觸發需要加個逾時,如果逾時設定短了失敗率很高(網路不穩),長了也很耗時,只是相對時間少一點,fsockopen去觸發需要加個延時(sleep(*)),都要留時間給網路傳輸資料,不是特別好,有其他解決方案嗎?
(必須在伺服器端)
用fsockopen fwrite()後 加上usleep(1000) 就可以了,目前穩定。
問題移步https://segmentfault.com/q/1010000004590173?_ea=660163
另外關於PHP逾時處理要注意:
下面例子是設定資料轉送時的逾時,不是整個串連的逾時。 如果跟我一樣問題的想用當前指令碼觸發另一個耗時很長的php指令碼不要用這種方式,這樣設定是無效的。這樣的設定是代表當前指令碼 等待耗時間長度的另外一個指令碼執行完成後返回資料,傳輸資料時不能超過一秒,不是說串連超過一秒就斷開。
$opts = array( 'http'=>array( 'timeout'=>1, // 設定逾時一秒,此處是大坑。 ));$context = stream_context_create($opts);file_get_contents('http://www.url.com/', false, $context);
如果用CURL
設定逾時
curl_setopt($ch, CURLOPT_TIMEOUT, 1); // 逾時秒curl_setopt($ch,CURLOPT_NOSIGNAL, 1); //設定毫秒時必加curl_setopt($ch,CURLOPT_TIMEOUT_MS, 1000); //逾時毫秒// 注意:這個逾時設定是代表整個串連的逾時設定。不管有沒串連上,有沒傳輸資料,到時間了就斷開,返回false
--- 雲網開 用手機建網站
php非同步 推薦workerman
http://doc3.workerman.net/faq/async-task.html
Swoole效能比workerman高點 因為是純c擴充的緣故
但同樣workerman比Swoole安裝要方便很多
用ajax非同步。
Swoole