我有一个必须针对某些事情运行的进程,并且不适合在用户端运行(处理时间超过15秒)所以我考虑使用cron作业但是再次,这也不合适,因为它会创建一个后台日志。我已经缩小了我的选择,要么运行一个监视mysql更改的无限进程,要么在检测到更改时配置mysql来触发脚本,但后者不是我想要进入的东西,除非它是我唯一的选择,这让我失望“无尽的”监控选项。
我正在考虑使用PHP的那种东西是:
while (true) {
$db->query('SELECT * FROM database');
while($row = $db->fetch_assoc()){
// do the stuff here
}
sleep(5);
}
然后通过命令行运行它。现在这是理论声音,但在实践中它的表现并不如我所希望的那样,使用的资源比我预期的要多(但不是超出我的范围,只是没有我的最佳目标是什么。所以我的问题如下:
PHP是否是错误的语言? PHP是我的工作,但我知道有时候这是错误的选择,我想也许这是。如果是,我应该使用哪种语言?
有没有更好的方法,我没有考虑过,这不是我列出的任何想法?
如果PHP是正确的选项,我如何优化我发布的代码,是否有一种方法比每次完成操作后休眠5秒更好?
提前致谢!我对任何想法持开放态度,只要它们在那里不太远,我正在运行我自己的服务器并且自由统治,所以对我能做的事情没有理论限制。
答案 0 :(得分:6)
我建议将循环移到shell脚本中,然后为每次迭代执行一个新的PHP进程。这样PHP就永远不会使用无限制的资源(即使某处存在内存/连接泄漏),因为每次迭代都会终止进程。像下面这样的东西应该没问题(Bash):
while true; do
php /path/to/your/script.php 2>&1 | logger ...(logger options)
sleep 5
done
我发现这种方法对于PHP中长时间运行的脚本来说更加健壮,可能是因为这与PHP作为CGI脚本运行时的运行方式非常相似。
答案 1 :(得分:4)
您应该始终使用您最熟悉的语言。如果这是PHP,那么这不是一个错误的选择。
睡觉前从数据库断开连接。这样,您的脚本将不会保留连接,即使在数据库重启后它也能正常工作。
使用后获得免费的mysql结果。始终检查守护进程中的错误情况,并适当地处理它们。
答案 2 :(得分:1)
PHP可能是错误的语言,因为它实际上是为临时服务请求而设计的,而不是创建长时间运行的守护进程。 (它最初是作为预处理器语言创建的,后来逐渐被用作Web应用程序语言。)
像Python这样的东西可能会更好地满足您的需求;它更适合“守护进程”程序。
那就是说, 可以在PHP中做你想做的事。
答案 3 :(得分:0)
您遇到了什么样的问题? 我不知道你在$ db中有数据库类,但它可能会产生内存泄漏。
此外,我建议关闭所有连接,并在循环结束时根据需要取消设置所有变量,并在开头重新打开! 如果它只在每10次交互时只有5秒睡眠maby。你可以为此做一个反击......
theese点认为这种方法没有错。