使用file_get_contents()的PHP脚本运行时间过长

使用file_get_contents()的PHP脚本运行时间过长,php,file-get-contents,Php,File Get Contents,我有一个PHP脚本,通过cron运行,它通过一个站点列表进行迭代,并根据API URL使用file_get_contents()收集每个站点的数据,然后将这些数据存储在MySQL数据库中。这个脚本运行于60个不同的站点,我们看到每个URL拉取都有高达5MB的序列化PHP数据 该系统在我的本地MAMP服务器上运行得很顺利,但一旦被放到远程服务器上,它就停止可靠运行。有时,它提取和存储数据,但存储的记录少于本地服务器。它还以504网关错误结束。在另一台服务器上,它根本不会完成。我们增加了php.in

我有一个PHP脚本,通过cron运行,它通过一个站点列表进行迭代,并根据API URL使用file_get_contents()收集每个站点的数据,然后将这些数据存储在MySQL数据库中。这个脚本运行于60个不同的站点,我们看到每个URL拉取都有高达5MB的序列化PHP数据

该系统在我的本地MAMP服务器上运行得很顺利,但一旦被放到远程服务器上,它就停止可靠运行。有时,它提取和存储数据,但存储的记录少于本地服务器。它还以504网关错误结束。在另一台服务器上,它根本不会完成。我们增加了php.ini中的所有时间限制,并将本地的时间限制与远程服务器进行了比较,没有发现任何突出的地方

有没有办法让包含这些重复操作的PHP脚本以更“分段”的方式运行?有没有办法在每个站点运行后“重置计时器”?它需要自动化,但针对每个站点设置cron(每个站点3个URL,60个站点)听起来就像是一场噩梦


提前谢谢

如果需要那么长时间才能运行,请不要通过web服务器运行。您已经有了一个cron作业,所以只需将cron作业设置为直接运行脚本(例如,
/usr/bin/php/home/path/to/cronjob.php
)。

如果需要那么长时间运行,请不要通过web服务器运行它。您已经有了一个cron作业,因此只需将cron作业设置为直接运行脚本(例如,
/usr/bin/php/home/path/to/cronjob.php
)。

您是否尝试过从远程服务器运行网络诊断到您试图访问的页面(Ping、DNS检查、Wget)?如果响应不是肯定的(HTTP 200代码),文件内容可能需要很长时间才能超时,或者被查询的站点可能需要很长时间才能响应。如果您不想等待失败,可以尝试使用适当的超时来设置。

您是否尝试过从远程服务器运行网络诊断以访问您试图访问的页面(Ping、DNS检查、Wget)?如果响应不是肯定的(HTTP 200代码),文件内容可能需要很长时间才能超时,或者被查询的站点可能需要很长时间才能响应。如果不想等待失败,可以尝试使用适当的超时来设置。

检查
php.ini
设置文件中的以下内容,以了解服务器之间的一致性;其中任何一个都可以解释行为上的差异:

  • 超时
  • 执行时间津贴
  • 内存限制
  • 数据包大小
  • 启用/禁用扩展/模块(例如curl、mysql等)

php.ini
设置文件中检查以下内容,以确保服务器之间的一致性;其中任何一个都可以解释行为上的差异:

  • 超时
  • 执行时间津贴
  • 内存限制
  • 数据包大小
  • 启用/禁用扩展/模块(例如curl、mysql等)

问题可能是由于达到PHP或web服务器的线程限制,也可能是由于服务器中关于每单位时间的连接数的规则造成的


如果您可以在不同的时刻拆分负载并执行这些cron作业,您将获得更好的结果

问题可能是由于达到了PHP或web服务器的线程限制,也可能是由于服务器中关于每单位时间连接数目的规则造成的


如果您可以拆分负载并在不同的时刻执行这些cron作业,您将获得更好的结果

谢谢。我确实使用流上下文设置了更长的超时,URL在自己调用时运行良好。它们可能需要很长时间才能返回(最多30秒,只有URL需要这么长的时间),而且它是一个健壮的API,所以不管它是什么,我都会得到响应,即使它是一个失败(我捕获并记录了它)。谢谢。我确实使用流上下文设置了更长的超时,URL在自己调用时运行良好。它们可能需要很长时间才能恢复(最多30秒,只有URL需要这么长的时间),而且它是一个健壮的API,所以不管它是否失败(我捕获并记录了失败),我都会得到响应。这就是我认为的问题所在,但我无法/能够看到需要调整的设置。我的想法是,将进程分块将有助于服务器,这是一种更好的方法,因为我们可以运行100多个站点,但如果可以的话,我不想在cron中有多个url。您是否尝试过在对远程站点url的每次调用之间设置
sleep($interval)
?我认为这种情况不太可能发生,web服务器非常擅长处理请求,不管速度有多快,只做三个就可以了。API更可能存在一些下游资源争用(DB、文件等)。好吧,您仍然可以做一段时间来测试理论。请记住,504基本上是连接中的日志延迟。我认为这就是问题所在,但我无法/能够看到需要调整的设置。我的想法是,将进程分块将有助于服务器,这是一种更好的方法,因为我们可以运行100多个站点,但如果可以的话,我不想在cron中有多个url。您是否尝试过在对远程站点url的每次调用之间设置
sleep($interval)
?我认为这种情况不太可能发生,web服务器非常擅长处理请求,不管速度有多快,只做三个就可以了。API更可能存在一些下游资源争用(DB、文件等)。好吧,您仍然可以做一段时间来测试理论。请记住,504基本上是连接中的日志延迟。这可能是票证。。。还有更多的信息吗?我刚开始设置cron(如果它是一个简单的RTFM,这是一个公平的响应),这可能是一张罚单。。。还有更多的信息吗?我是新来的