代码之家  ›  专栏  ›  技术社区  ›  sam

运行“无止境”进程监控mysql的最佳方法?

  •  1
  • sam  · 技术社区  · 16 年前

    我有一个进程必须针对某些事情运行,它不适合在用户端运行(要处理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 回复  |  直到 16 年前
        1
  •  6
  •   Ramon    16 年前

    我建议将循环移出一个shell脚本,然后为每个迭代执行一个新的PHP过程。这样,PHP就永远不会使用无限的资源(即使在某个地方存在内存/连接泄漏),因为进程在每次迭代中都会终止。类似下面这样的内容应该很好(bash):

    while true; do
      php /path/to/your/script.php 2>&1 | logger ...(logger options) 
      sleep 5
    done
    

    我发现这种方法对于PHP中的长时间运行的脚本更为健壮,可能是因为这与作为CGI脚本运行时PHP的操作方式非常相似。

        2
  •  4
  •   jmz    16 年前
    1. 你应该一直使用你最熟悉的语言。如果这是PHP,那么这不是一个错误的选择。

    2. 睡眠前断开与数据库的连接。这样,脚本就不会保留连接,即使在数据库重新启动后,它也会正常工作。

    3. 使用后释放mysql结果。始终检查监控进程中的错误情况,并对其进行适当的处理。

        3
  •  1
  •   Amber    16 年前

    PHP可能是一种错误的语言,因为它实际上是为特殊基础上的请求而设计的,而不是创建长时间运行的守护进程。(它最初是作为预处理器语言创建的,后来作为Web应用程序语言被广泛使用。)

    类似于python的东西可以更好地满足您的需要;它是为“类似守护进程”的程序设计的,有点自然。

    也就是说 是 可以在PHP中执行您想要的操作。

        4
  •  0
  •   The Surrican    16 年前

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

    此外,如果在循环结束时需要,我建议关闭所有连接并取消设置所有变量,然后在开始时重新打开! 如果它只有5秒钟的睡眠,那么只有在每10次互动或别的时候。你可以做个计数器…

    这些观点认为这种方法没有任何问题。

    推荐文章