【发布时间】:2016-05-04 14:11:18
【问题描述】:
我有一个使用 Cron 运行的 cakephp shell 脚本
bin/cake hello >/dev/null 2>&1
我的HelloShell.php 的main() 是这样的:
public function main()
{
$this->loadModel('Hello');
$Hello = $this->Hello;
$Hello->doStuff($this->args);
return 0; // I tried to add return but it didn't help
}
HelloModel 使用另一个模型,收集一些信息并将其保存到数据库中。
我突然注意到,即使一切都已完成并且应该关闭该进程,该进程仍保留在内存中。
我在控制台中运行ps aux 并查看
p1033 607670 0.0 0.0 106100 1132 ? Ss 23:42 0:00 /bin/sh -c /home/xxxx/public_html/bin/cake hello do_stuff >/dev/null 2>&1
p1033 607676 0.0 0.0 295656 17400 ? S 23:42 0:00 php /home/xxxx/public_html/bin/cake.php hello do_stuff
一段时间后,该命令的另一个副本由 cron 启动,并且它也保留在内存中,直到服务器的所有者将它们全部杀死。
我试过像这样运行一个简单的 php 脚本
for ($i = 0; $i < 10; $i++) sleep(1);
我看到它出现在进程列表中,10秒后消失。
那么,谁能告诉我 cakephp 做错了什么? 作业完成后,我应该怎么做才能防止进程留在内存中?
【问题讨论】:
-
好吧,我发现如果我不加载任何模型而只使用无用的 for 循环 - 该过程会在 10 秒后消失。这是否意味着我对 DB 做错了什么?在模型中,我使用 ORM 方法和 ConnectionManager 进行一些查询。然后我调用 disconnect() 方法。
-
如果我在控制台中手动运行相同的作业 - 作业完成后它不会留在内存中。