gpt4 book ai didi

php - 一段时间后脚本不断消失,而不是超时/内存问题

转载 作者:可可西里 更新时间:2023-11-01 00:52:18 24 4
gpt4 key购买 nike

我有一个长时间运行的脚本无缘无故地消失了。它应该运行 8 个多小时,但在一两个小时后就消失了,没有错误,什么也没有。我尝试通过 CLI 和通过 http 运行它,没有区别。

我设置了以下参数:

set_time_limit(0);
ini_set('memory_limit', '1024M');

我一直在监控内存使用情况,并没有超过200M

还有什么我想念的吗?为什么会灭绝?

最佳答案

一种可能的解释是 PHP 垃圾收集器干扰了脚本。这可能就是您看到随机死亡的原因。当垃圾收集器打开时,只要根缓冲区满了,就会执行循环查找算法。

PHP manual状态:

The rationale behind the ability to turn the mechanism on and off, and to initiate cycle collection yourself, is that some parts of your application could be highly time-sensitive.

您可以尝试使用 gc_disable 禁用 PHP 垃圾收集器。手册建议您在禁用之前立即调用 gc_collect_cycles 以释放缓冲区。

另一个解释可能是代码本身。一个 8 小时的脚本是一个长脚本,如果它很复杂,它很容易遇到障碍导致脚本退出。我认为对于您现在的故障排除,您绝对应该使用 error_reporting(-1); 将错误报告转为报告一切

此外,如果您的脚本正在与其他服务(例如数据库)通信,则很可能是问题所在。如果数据库服务器内存不足或超时,可能会导致您的脚本挂起并死掉。如果是这种情况,您可以拆分与数据库的连接,并在脚本期间以特定的时间间隔连接/断开连接,以保持该连接最新。同样的心态也适用于您可能与之通信的任何其他服务。

仅出于测试目的,您可以故意让您的脚本在每次成功查询时写入日志文件,确保包含查询开始时的时间戳和查询结束时的时间戳。您可能不会收到任何错误,但它可以帮助您确定是否存在特定的问题查询,或者查询的挂起时间是否比平时长。您还可以检查以确保您的 MySQL 连接仍然有效,并打印出一些信息来通知您。

示例日志文件:

[START 2011/01/21 13:12:23] MySQL Connection: TRUE [END 2011/01/21 13:12:28] Query took 5s
[START 2011/01/21 13:12:28] MySQL Connection: TRUE [END 2011/01/21 13:12:37] Query took 9s
[START 2011/01/21 13:12:39] MySQL Connection: TRUE [END 2011/01/21 13:12:51] Query took 12s

关于php - 一段时间后脚本不断消失,而不是超时/内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4658546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com