运行监控MySQL的“无休止”过程的最佳方法?

时间:2010-08-28 22:46:57

标签: php database theory

我有一个必须针对某些事情运行的进程,并且不适合在用户端运行(处理时间超过15秒)所以我考虑使用cron作业但是再次,这也不合适,因为它会创建一个后台日志。我已经缩小了我的选择,要么运行一个监视mysql更改的无限进程,要么在检测到更改时配置mysql来触发脚本,但后者不是我想要进入的东西,除非它是我唯一的选择,这让我失望“无尽的”监控选项。

我正在考虑使用PHP的那种东西是:

while (true) {
  $db->query('SELECT * FROM database');
  while($row = $db->fetch_assoc()){
    // do the stuff here
  }
  sleep(5);
}

然后通过命令行运行它。现在这是理论声音,但在实践中它的表现并不如我所希望的那样,使用的资源比我预期的要多(但不是超出我的范围,只是没有我的最佳目标是什么。所以我的问题如下:

  1. PHP是否是错误的语言? PHP是我的工作,但我知道有时候这是错误的选择,我想也许这是。如果是,我应该使用哪种语言?

  2. 有没有更好的方法,我没有考虑过,这不是我列出的任何想法?

  3. 如果PHP是正确的选项,我如何优化我发布的代码,是否有一种方法比每次完成操作后休眠5秒更好?

  4. 提前致谢!我对任何想法持开放态度,只要它们在那里不太远,我正在运行我自己的服务器并且自由统治,所以对我能做的事情没有理论限制。

4 个答案:

答案 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)

  1. 您应该始终使用您最熟悉的语言。如果这是PHP,那么这不是一个错误的选择。

  2. 睡觉前从数据库断开连接。这样,您的脚本将不会保留连接,即使在数据库重启后它也能正常工作。

  3. 使用后获得免费的mysql结果。始终检查守护进程中的错误情况,并适当地处理它们。

答案 2 :(得分:1)

PHP可能是错误的语言,因为它实际上是为临时服务请求而设计的,而不是创建长时间运行的守护进程。 (它最初是作为预处理器语言创建的,后来逐渐被用作Web应用程序语言。)

像Python这样的东西可能会更好地满足您的需求;它更适合“守护进程”程序。

那就是说, 可以在PHP中做你想做的事。

答案 3 :(得分:0)

您遇到了什么样的问题? 我不知道你在$ db中有数据库类,但它可能会产生内存泄漏。

此外,我建议关闭所有连接,并在循环结束时根据需要取消设置所有变量,并在开头重新打开! 如果它只在每10次交互时只有5秒睡眠maby。你可以为此做一个反击......

theese点认为这种方法没有错。