我正在捣乱守护进程,并想知道使用PHP执行此操作是否可行(在内存和CPU使用方面以及可靠性方面):
<?php
// Ignore user aborts and allow the script
// to run forever
ignore_user_abort(true);
set_time_limit(0);
$fp = fopen('loop.log', 'w');
fwrite($fp, date('Y-m-d H:i:s') . ' Started' . PHP_EOL);
while(1) {
fwrite($fp, date('Y-m-d H:i:s') . ' Looped' . PHP_EOL);
if (file_exists('loop.stop')) {
break;
}
// Sleep for 100 seconds
sleep(100);
}
fwrite($fp, date('Y-m-d H:i:s') . ' Stopped' . PHP_EOL);
fclose($fp);
这个简单的例子(改编自ignore_user_abort的PHP手册)只是容器脚本。实际功能将放在while
循环中。
我已经在我的笔记本电脑上运行了这个脚本7个小时了,它看起来很好,但它并没有做太多。还有其他人试过吗?
答案 0 :(得分:3)
我倾向于将循环放入BASH脚本中,以便定期清理所有PHP资源。
#!/bin/bash
clear
date
php -f doChecksAndAct.php
sleep 100
# rerun myself
exec $0
如果您在PHP脚本中执行任何特别重的设置任务,您还可以在其中放置一个小(ish)循环(例如50-100次迭代,如果它们之间没有暂停多秒)减少运行之间的总开销时间。
添加:我在Bash / PHP(或其他语言)配对上发表博客,以便您可以非常轻松地在PHP脚本中循环,然后立即退出重启,或暂停一段时间 - Doing the work elsewhere -- Sidebar running the worker。
答案 1 :(得分:1)
我建议反对。
4年前有一个错误打开Memory allocated for objects created in object methods is not released。
开发人员认为这是功能请求,但在使用长时间运行的进程时,很难解决它。当我能够退出申请时,我尽力但非常放心。
答案 2 :(得分:0)
声音服务器守护程序可能值得一试