使用PHP CURL發起一個POST請求,請求的本機某個端口(有PHP常駐程序監聽那個端口),卻發現速度慢得要死,經常需要1到2秒也就是1000多毫秒才能傳回,要shi啊!代碼如下:
$t1 = microtime(true);
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_CONNECTTIMEOUT_MS => 200,
CURLOPT_TIMEOUT_MS => 1500,
CURLOPT_HEADER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_RETURNTRANSFER => true,//不輸出
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($post),
]);
$result = curl_exec($ch);
if ($result === false)
{
return ['err' => curl_error($ch), 'data' => ''];
}
else
{
$result = json_decode($result, true);//傳回的是json字元串
$result['curl_time_use'] = microtime(true) - $t1;
return ['err' => null, 'data' => $result];
}
這上邊$post變量就一個簡單的數組,請求的端口處理起來不會超過10毫秒(0.01s),這是一定的,居然總耗時會達到1000毫秒以上,根本沒法玩耍。多次測試,發現$post某個值(字元串)隻要超出某個長度就會這麼慢,不超過還是很快的。實測,那個值使用strlen()不超過357是OK的,達到358就歇菜了!這是什麼情況?PHP版本是5.4.16。

一翻搜尋,說加個什麼header為”Expect:”就可以了(别人說的是沒資料傳回,我這還是有的,隻是慢),跟着試了一下,添加以下header:
CURLOPT_HTTPHEADER => ['Expect:'],
果然OK了,長度超過357也正常了:
這裡邊,肯定不是什麼357的問題,這也不是一個什麼特殊的數字。再仔細看文章,正确說法是:POST的資料(估計是原始資料)超過1024位元組,CURL不是直接發起POST請求,而是分兩步:
發送一個請求, 包含一個Expect:100-continue, 詢問Server使用願意接受資料
接收到Server傳回的100-continue應答以後, 才把資料POST給Server
這樣,當Server端不傳回100-continue的時候,就出問題了。我這裡PHP常駐程序使用的是Swoole或Workerman,可能有處理,CURL能成功但慢了很多。