首页 > 解决方案 > 服务器代码产生过多的 php 实例

问题描述

我有一个服务器,它有一个由频繁的 cron 作业触发的操作。
这是一个基于 Silverstripe (4.0) 的 php 应用程序。
我面临的问题是 php 进程保持活动状态并保持数据库连接打开。这意味着几天后,一旦 SQL 停止接受新连接,站点就会完全停止工作。

该系统有两个关于 cron 作业的任务;

一个人需要一个巨大的 CSV 文件并将其拆分为较小的子文件,然后将这些子文件导入数据库。这个使用锁定文件来防止它运行到以前运行的实例中。我不太确定这是否有效。

第二个任务处理所有已经大批量更新的记录。

其中任何一个都可能是超载的根源,但我不确定如何缩小范围。
诊断问题根源的最佳方法是什么?

标签: phpcronsilverstripe

解决方案


在调试方面,这就像使用xdebug和kcachegrind之类的东西来分析应用程序的任何其他任务一样。为确保进程不会运行太久,您可以限制.PHP.iniCLI

然后让CLI进程运行很长时间,但只有足够的时间添加一些东西来设置每行的最大执行时间:

$allowed_seconds_per_row = 3;
foreach($rows_to_process as $row){
    set_time_limit($allowed_seconds_per_row);
    $this->process($row);
}

您还可以注册一个关闭函数来记录脚本结束时的状态。

内存很可能是导致失败和调试的关键原因,主要集中在内存使用上,并且可以通过根据需要取消设置可变数据来控制。


推荐阅读