【发布时间】:2018-12-16 05:38:18
【问题描述】:
我使用 Zend Framework 2 开发了一个网站。它基本上是一个价格比较网站,集成了许多顶级联盟网络。我编写了一个脚本来检查每个附属网络的价格,然后用该价格更新我的本地数据库。根据我联系的附属网络,我可能正在进行 API 调用(Amazon 或 CJ.com),或者我可能正在查看 XML 产品提要(Pepperjam 或 LinkShare)。 XML 产品提要将在本地托管。
目前,我正在使用此脚本检查大约 3,500 个 sku。其中绝大多数 (95%+) 都针对 XML 产品提要。我估计这个脚本可能需要大约 10 分钟才能完成。我正在查看的一些 XML 文件大小约为 8 MB。
我已经在我的本地环境中彻底测试了这个脚本,并竭尽全力确保没有内存泄漏或类似性质的东西会导致性能问题。例如,我确保尽可能使用数据流,以避免将 XML 文件一遍又一遍地放入内存中,等等。可以说,脚本在本地运行没有问题。
此脚本旨在作为 cron 作业运行,但我确实有办法通过临时安全管理界面触发它。在本地,这就是我启动脚本运行的方式,一切都很顺利。
当我将代码部署到共享主机帐户时,我遇到了各种各样的问题。为了排除故障,我将日志记录附加到该脚本的各个阶段,以跟踪它的启动时间、进度以及每个步骤的完成时间等。所有这些都将记录到 MySQL 数据库中。
问题 #1:如果我通过 HTTP 请求临时运行脚本,我发现它将运行几分钟,然后脚本再次启动(所以现在有两个实例显然正在运行)。再等几分钟,第三个将启动,等等......这是一个示例,当我通过 HTTP 请求触发脚本在晚上 10:09 运行时。
不用说,我不会通过 HTTP 请求运行它,因为它只会让我的网络托管服务提供商遇到麻烦 :)
问题 #2:当脚本在服务器上运行时,通过 cron 作业触发,它无法完成。我已经获取了数据库的生产副本并将其与 XML 文件一起在本地获取,它运行良好。因此,坏数据暴露坏代码应该不是问题。我的观察是——脚本几乎运行了完全相同的时间——在中止、终止或其他任何情况下。最后更新的记录通常在脚本触发后大约 4 分 30 秒左右(如果有记忆的话)加盖时间戳。 SKU列表是不断变化的,所以它结束的记录不同,但每次更新的时间几乎相同。错误日志中没有记录任何内容。我通过 SSH top 命令监控服务器资源,并没有什么异常。正在检查 CPU 使用率,并且使用的内存没有增加。
我有一个通过 Bluehost 共享的主机帐户。我的想法是,这可能是脚本最大执行时间问题。我在脚本本身和通过 php.ini 中延长了最大执行时间。没有区别。
所以我想我正在寻找的是关于下一步去哪里的一些新想法。我应该问我的托管公司什么问题,这样他们才能帮助我弄清楚这一点。至少可以说,它们只是有点帮助。这可能是对我的托管帐户的一些限制吗?触发某种正在杀死脚本的自动监视器?对于这种性质的脚本,哪些类型的 Apache 设置可能有问题? PHP.ini 设置?您可以提供的任何意见绝对会有所帮助。
为什么当通过 HTTP 触发时,它会不断启动新实例?我想我可以不用手动运行它,而只能通过 cron 作业运行它,但这也不起作用。所以....有兴趣听到社区对此的想法。谢谢!
【问题讨论】:
标签: php linux apache cron-task