天天看點

php 多個curl 很慢,PHP CURL POST 很慢?

使用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。

php 多個curl 很慢,PHP CURL POST 很慢?

一翻搜尋,說加個什麼header為”Expect:”就可以了(别人說的是沒資料傳回,我這還是有的,隻是慢),跟着試了一下,添加以下header:

CURLOPT_HTTPHEADER => ['Expect:'],

果然OK了,長度超過357也正常了:

php 多個curl 很慢,PHP CURL POST 很慢?

這裡邊,肯定不是什麼357的問題,這也不是一個什麼特殊的數字。再仔細看文章,正确說法是:POST的資料(估計是原始資料)超過1024位元組,CURL不是直接發起POST請求,而是分兩步:

發送一個請求, 包含一個Expect:100-continue, 詢問Server使用願意接受資料

接收到Server傳回的100-continue應答以後, 才把資料POST給Server

這樣,當Server端不傳回100-continue的時候,就出問題了。我這裡PHP常駐程序使用的是Swoole或Workerman,可能有處理,CURL能成功但慢了很多。