PHP HTTP请求通过fsockopen和fwrite在linux上无法正常工作

时间:2012-07-04 14:12:17

标签: php http fwrite fsockopen

我们目前正在使用套接字来打开和写入http连接,请求我们不一定关心响应!跟踪ping等

这适用于我们的旧服务器和Windows开发环境,但不适用于我们的新ubuntu服务器。

我们使用的代码如下

        $aUrlParts = parse_url($sUrl);

        $fp = fsockopen(
            $aUrlParts['host'],
            isset($aUrlParts['port']) ? $aUrlParts['port'] : 80,
            $errno, $errstr, 30
        );

        $sHeader = "GET {$aUrlParts['path']}?{$aUrlParts["query"]} HTTP/1.1\r\n";
        $sHeader.= "Host: {$aUrlParts['host']}\r\n";
        $sHeader.= "Connection: Close\r\n\r\n";

        fwrite($fp, $sHeader);
        fclose($fp);

如果我在fwrite之后进行读取,我可以从服务器上完成所有工作,但与仅仅卷曲URL

相比,这样做无法以这种方式执行请求

我已经尝试刷新套接字并将其设置为非阻塞但不起作用!只做一次阅读是唯一有效的方法!

感谢任何帮助

编辑:我会提到这些新服务器是基于AWS的,我感觉它们上的套接字实现可能会有所不同

2 个答案:

答案 0 :(得分:0)

我不确定这是否值得作为答案,但我有完全相同的问题,这就是我来到这里的方式。我唯一的区别是我试图对服务器本身执行请求。

我的解决方案是在服务器的访问管理中。我有一个htaccess文件,阻止任何人查看,除了我自己的网络,但问题是它也阻止我的服务器请求自己。

所以它可能与服务器访问管理有关。如果这有帮助,请告诉我。

答案 1 :(得分:0)

我们使用了fsockopenfwrite组合,然后有一天它停止工作。还是有点断断续续。经过一些研究和测试,并且如果您启用了fopen包装器,我最终使用了file_get_contentsstream_context_create函数,并将超时设置为100秒。超时参数可以接收浮点值(https://www.php.net/manual/en/context.http.php)。我将其包装在try ... catch块中,因此它将无声地失败。对于我们的目的,它的工作原理很漂亮。如果需要,您可以在捕获中进行记录。

$context = stream_context_create([
    "http" => [
        "method"=>"GET",
        "timeout" => .01
        ]
    ]
);

try {
    file_get_contents($url, 0, $context);
}catch( Exception $e ){
    // Fail silently
}