通过 fsockopen 和 fwrite 的 PHP HTTP 请求在 Linux 上无法按预期工作


PHP HTTP Request via fsockopen and fwrite not working as expected on linux

我们目前正在使用套接字来打开和写入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的,我有一种感觉,它们上的套接字实现可能会有所不同

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

我的解决方案是服务器的访问管理。我有一个 htaccess 文件,它阻止任何人查看除我自己的网络之外的任何人,并且故障是它也阻止了我的服务器请求自己。

所以也许它与服务器访问管理有关。让我知道这是否有帮助。

我们使用的是fsockopenfwrite组合,然后它启动并停止工作了一天。或者有点间歇性。经过一些研究和测试,如果您启用了 fopen 包装器,我最终使用了超时设置为 100 秒的 file_get_contentsstream_context_create 函数。超时参数可以接收浮点值 (https://www.php.net/manual/en/context.http.php)。我试了一下就包了...捕获块,因此它将静默失败。它非常适合我们的目的。如果需要,您可以在捕获中进行日志记录。

$context = stream_context_create([
    "http" => [
        "method"=>"GET",
        "timeout" => .01
        ]
    ]
);
try {
    file_get_contents($url, 0, $context);
}catch( Exception $e ){
    // Fail silently
}