我有一个服务器,该服务器的动作由频繁的cron工作触发。
这是在Silverstripe(4.0)上构建的php应用程序。
我面临的问题是php进程保持活动状态,并且还保持数据库连接打开。这意味着几天后,一旦SQL停止接受新连接,站点将完全停止工作。
系统对cron作业有两项任务;
一个人将一个庞大的CSV文件放入一个较小的子文件中,然后将其导入数据库。这个使用锁文件来防止它运行到先前运行的实例中。我不太确定这是否有效。
第二个任务处理所有已批量更新的记录。
这两个都是超载的原因,但我不确定如何缩小超载。
诊断问题根源的最佳方法是什么?
答案 0 :(得分:2)
就调试而言,这就像使用xdebug和kcachegrind对应用程序进行性能分析的任何其他任务一样。为了确保进程不会运行太长时间,您可以将PHP.ini
的{{3}}限制为CLI
的限制。
然后让CLI
进程运行很长时间,但只需添加足够的时间来设置每行的最大执行时间:
$allowed_seconds_per_row = 3;
foreach($rows_to_process as $row){
set_time_limit($allowed_seconds_per_row);
$this->process($row);
}
您也可以max_execution_time在脚本结束时记录状态。
内存可能是导致故障和调试集中在register a shutdown function上的关键原因,并且可以根据需要由memory usage变量数据进行控制。