0

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

该系统在我的本地 MAMP 服务器上运行良好,但是一旦将其放置在远程服务器上,它就会停止可靠地运行。有时它会提取和存储数据,但存储的记录少于本地服务器。它还以 504 网关错误结束。在另一台服务器上,它根本没有完成。我们提高了 php.ini 中的所有时间限制,并将我在本地的内容与远程服务器进行了比较,但没有看到任何突出的内容。

有什么方法可以让 PHP 脚本以更“分段”的方式运行这些多次重复的操作?每个站点运行后有什么方法可以“重置计时器”吗?它需要自动化,但是为每个站点设置一个 cron(每个站点 3 个 URL,60 个站点)听起来就像是一场噩梦。

提前致谢。

4

4 回答 4

2

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

于 2012-10-19T15:35:38.510 回答
1

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

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

于 2012-10-19T15:41:26.700 回答
0

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

于 2012-10-19T15:38:17.400 回答
0

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

  • 超时
  • 执行时间津贴
  • 内存限制
  • 数据包大小
  • 启用/禁用扩展/模块(例如 curl、mysql 等)
于 2012-10-19T15:39:39.057 回答