Home » Code » PHP CURL POST 很慢?

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-post-slow

一翻搜索,说加个什么header为”Expect:”就可以了(别人说的是没数据返回,我这还是有的,只是慢),跟着试了一下,添加以下header:

CURLOPT_HTTPHEADER => ['Expect:'],

果然OK了,长度超过357也正常了:

php-curl-post-slow-resolve

这里边,肯定不是什么357的问题,这也不是一个什么特殊的数字。再仔细看文章,正确说法是:POST的数据(估计是原始数据)超过1024字节,CURL不是直接发起POST请求,而是分两步:

  1. 发送一个请求, 包含一个Expect:100-continue, 询问Server使用愿意接受数据
  2. 接收到Server返回的100-continue应答以后, 才把数据POST给Server

这样,当Server端不返回100-continue的时候,就出问题了。我这里PHP常驻进程使用的是Swoole或Workerman,可能有处理,CURL能成功但慢了很多。

参考链接:http://www.laruence.com/2011/01/20/1840.html

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Time limit is exhausted. Please reload CAPTCHA.