【问题标题】:PHP HTTP Request via fsockopen and fwrite not working as expected on linux通过 fsockopen 和 fwrite 的 PHP HTTP 请求在 linux 上无法正常工作
【发布时间】:2025-12-22 23:55:11
【问题描述】:

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

【问题讨论】:

  • 接收服务器上的博客有线索吗?
  • 很遗憾接收服务器都是第三方
  • 他们不允许您访问您的日志吗?那没有帮助,大多数都有。你不能在内部设置一个测试服务器来检查它的工作原理吗?
  • 是的,我可能会设置一些本地 url 来连接
  • 在带有 Apache 的简单 Ubuntu 上,您的 sn-p 可以工作,所以它必须是服务器端的东西。

标签: php http fwrite fsockopen


【解决方案1】:

我们使用 fsockopenfwrite 组合,然后它在一天停止工作。或者它是一种间歇性的。经过一些研究和测试,如果你启用了 fopen 包装器,我最终使用了 file_get_contentsstream_context_create 函数,超时设置为 100 秒。 timeout 参数可以接收浮点值(https://www.php.net/manual/en/context.http.php)。我将它包装在一个 try...catch 块中,这样它就会默默地失败。它非常适合我们的目的。如果需要,您可以在 catch 中记录一些内容。

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      最近更新 更多