【问题标题】:fsockopen seems very slowfsockopen 似乎很慢
【发布时间】:2015-05-25 22:00:05
【问题描述】:

为什么fsockopen 与来自浏览器的相同请求相比如此缓慢?

php fsockopen:0.254

浏览器:0.070

fsockopen 请求

$time = microtime(true);

if($fp = fsockopen('ssl://domain.com', 443, $errno, $errstr, 20)){
    echo "\n".(microtime(true) - $time);
    $this->request = 'POST '.$path.' HTTP/1.1'.$crlf
        .'Host: '.$this->host.$crlf
        .'Content-Type: application/x-www-form-urlencoded'.$crlf
        .'Content-Length: '.$content_length.$crlf
        .'Connection: Close'.$crlf.$crlf
        .$body;
    fwrite($fp, $this->request);

    while($line = fgets($fp)){
        if($line !== false){
            $this->response .= $line;
        }
    }

    fclose($fp);
}

echo "\n".(microtime(true) - $time);

fsockopen 结果

0.18865990638733
0.25424790382385

来自浏览器的请求

【问题讨论】:

  • dns 缓存?反向dns查找时间?网络呼叫不仅仅是在线上的飞行时间。
  • 如何在 fsockopen 中使用 DNS 缓存?
  • 你没有。这是在系统解析器级别完成的。
  • 你的意思是 /etc/hostsc:\windows\system32\drivers\etc\hosts
  • 节点。这只是硬编码 dns 映射,与解析器无关。

标签: php fsockopen


【解决方案1】:

可能是 EOF 问题,你的 fopen 等到超时。

尝试较低的超时以更快地返回,但这不是一个优雅的解决方案。

其他解决方案是使用 bucle 手动查询连接,例如以下示例:

while (!feof($conn)) {
    print fgets($conn, 1024);
}

示例来源: https://stackoverflow.com/a/1319434/3518053

【讨论】:

  • 我正在执行测试,但我无法重现问题,对于某些示例页面,fopen 连接非常快。可以给我一个可以重现问题的网址吗?
【解决方案2】:

【讨论】:

    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 2010-11-22
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 2016-09-08
    相关资源
    最近更新 更多