【问题标题】:PHP file_get_contents Returns 504 on Larger FilesPHP file_get_contents 在较大的文件上返回 504
【发布时间】:2016-04-05 09:25:35
【问题描述】:

我正在构建一个从 MySociety 的 EveryPolitician 下载 JSON 文件的 PHP 网站。其中一些文件很小,而另一些则非常庞大。以下是我提出的典型请求的两个示例:

$g = file_get_contents("https://cdn.rawgit.com/everypolitician/everypolitician-data/65c4534/data/US_Virgin_Islands/Legislature/ep-popolo-v1.0.json");

$g = file_get_contents("https://cdn.rawgit.com/everypolitician/everypolitician-data/65c4534/data/UK/Commons/ep-popolo-v1.0.json");

第一行运行良好,我认为这是因为所请求的文件规模较小,但第二行在返回网关超时错误 (504) 之前会在浏览器中永久加载。

如果我将浏览器指向第二个 URL,它会很好地加载(尽管几秒钟后;毕竟它很大)。目前,该脚本正在我的本地计算机上运行,​​因此带宽或互联网速度没有差异。如您所见,这两个文件都来自 GitHub。

让我更困惑的是,几天前第二行确实有效。

这只是 PHP 的 file_get_contents() 的限制吗?有没有办法使用 file_get_contents() 解决它,或者在这种情况下是否有另一个库可以更好地工作?

【问题讨论】:

  • curl 比 file_get_contents 更健壮和可配置
  • Guzzle 是一个对 curl 更友好的包装器。

标签: php file-get-contents


【解决方案1】:

您可以尝试设置默认套接字超时:

ini_set('default_socket_timeout', 360);

这将使 file_get_contents() 有 6 分钟的时间尝试连接。此外,您可以创建一个上下文数组并将其传递给 file_get_contents() 函数,这样您就不必更改 ini 值 ala:

$context = stream_context_create(array( 
    'http' => array( 
        'timeout' => 360 
        ) 
    ) 
);
file_get_contents("https://cdn.rawgit.com/everypolitician/everypolitician-data/65c4534/data/UK/Commons/ep-popolo-v1.0.json", 0, $context); 

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多