PHP file_get_contents 有时会在 2 个服务器中的 1 个上返回 502

PHP file_get_contents 有时会在 2 个服务器中的 1 个上返回 502

我有两个虚拟服务器。

旧版本:Ubuntu 12.04 和 PHP 7.2。新版本:CentOS 7.9 和 PHP 8.0。

两台服务器上都运行着同一个应用程序。cron 会定期从另一个网站获取一些详细信息。类似于以下代码

file_get_contents("http://mirror.facebook.net/centos/timestamp.txt")

在旧服务器上,它运行良好。我从来没有遇到过问题。在新服务器上,我有时会收到此消息

Warning: file_get_contents(mirror.facebook.net/centos/timestamp.txt): Failed to open stream: HTTP request failed! HTTP/1.0 502 Bad Gateway

我不知道为什么会发生这种情况。它影响了大约 1% 的呼叫。

有人知道我应该去哪里查找以及该做什么来解决这个问题吗?

[编辑]我实现了如下所述的错误和时间跟踪。

首先是代码:

$t0 = microtime(true);
$jsonString = file_get_contents($pageUrl);
if ($jsonString === false) {
    $t1 = microtime(true);
    var_dump(sprintf(
        'Fehler beim Abruf der URL %s',
        $pageUrl,
    ));
    var_dump($t1 - $t0);
    var_dump(error_get_last());

    return 0;
}

现在来看结果。

array(4) {
  ["type"]=>
  int(2)
  ["message"]=>
  string(145) "file_get_contents(https://www.example.com/): Failed to open stream: HTTP request failed! HTTP/1.0 502 Bad Gateway
"
  ["file"]=>
  string(62) "/path/to/src/Service/WebcrawlerService.php"
  ["line"]=>
  int(61)
}

不幸的是,结果并没有提供更多细节。它仍然是 502

答案1

我怀疑您的新服务器偶尔会遇到网络超时(DNS?)。要深入了解,请尝试在失败后立即记录详细错误file_get_contents()以及失败前请求的持续时间:

$t0 = microtime(true);
if (($data = @file_get_contents("http://mirror.facebook.net/centos/timestamp.txt")) === false) {
    $t1 = microtime(true);
    var_dump($t1 - $t0);  // duration
    var_dump(error_get_last());
}

这些输出结合起来可能会给你提供关于后续步骤的提示。

相关内容