我有一个每日 cron 作业,运行大约需要 5 分钟(它会收集一些数据,然后更新各种数据库)。它工作正常,但问题是,在这 5 分钟内,该站点完全没有响应任何请求,无论是 HTTP 还是其他请求。
看起来 cron 作业脚本在运行时会占用所有资源。我在 PHP 文档中找不到任何可以帮助我的东西 - 我怎样才能让脚本知道只使用,比如说,50% 的可用资源?我宁愿让它运行 10 分钟,并在这段时间内让用户可以使用该网站,也不愿让它运行 5 分钟,然后每天都有用户抱怨停机。
我确信我可以想出一种方法来配置服务器本身来实现这一点,但我更希望 PHP 中有一种内置方法来解决这个问题。有没有?
或者,作为 B 计划,我们可以在脚本运行时将所有用户请求重定向到静态停机页面(与现在发生的情况相反,即页面无限期加载或最终超时)。
普通脚本无法占用 100% 的资源,资源会分散到各个进程中。它可能会严重减慢一切,但不会锁定所有资源(不做一些时髦的事情)。你可以通过这样做得到提示top -s
在命令行中,查看哪个进程占用大量资源。
这导致得出结论:某些东西锁定了所有进一步的进程。正如 Arkascha 评论的那样,您的数据库很有可能被锁定。这个答案解释了哪种表类型 https://stackoverflow.com/a/6796566/2519416你应该使用;如果您没有将其设置为 InnoDB,您可能需要这样做,至少对于锁定表而言。
如果您写入大文件,也可能是磁盘 I/O,尝试将其拆分为较小的读/写或尝试将一些信息(例如,如果它是带有列表的文件)到数据库中(假设有空闲空间) )。
也可能是CPU。要解决这个问题,您需要提高代码效率。重新检查您的代码,看看您是否进行了繁重的操作,并尝试使这些操作更小。通常您希望尽可能快,现在您希望它们尽可能轻量级,这改变了您编写代码的方式。
如果仍然锁定,则需要进行调试。关闭大部分代码并检查锁定是否仍然发生。继续打开代码,直到您注意到锁定。然后解决这个问题。试着弄清楚是什么让你付出了如此大的代价。只有少数脚本需要大量资源,现在是优化的时候了。一种选择可能是将其分为两个(或更多)步骤。运行一个准备/清理数据的 cron 以及一个处理数据的 cron。这些不必同步运行,它们之间可能有几分钟的时间。
如果这不是一个选择,请对您的代码进行基准测试并尽可能地改进。如果您有繁重的查询,则可以通过在繁重的查询中仅选择 ID 并使用第二个查询来获取数据来改进。如果可以,请使用数据库来过滤、排序和管理数据,不要在 PHP 中这样做。
我也实现过一次是每N个动作睡眠一次。
如果您的脚本确实如此极端,则另一种解决方案可能是将其移至网站上很少/没有访问者的时间。即使消除了瓶颈,也没有人喜欢速度慢的网站。
并且始终可以选择增加硬件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)