PHP进程始终在

时间:2016-01-29 02:21:53

标签: php python mysql long-running-processes

我正在为我的公司做一个项目。从本质上讲,我们将有一个长时间运行的进程,它将在python服务器上命中API以发送和接收JSON响应。它将从这些API调用中获取数据并更新mysql数据库中的表。它会响应,但也会执行计划任务。

代码已编写且功能正常。问题是,你如何智能地执行这个?在保持记忆的同时。

很像this question我现在,非常遗憾地,尽管我有很多保留,但是在一切结束后,使用while(true)循环无限地运行15秒。引用的问题没有很多可行的答案,并且已经将近3年了。关于如何以一种内存友好和智能的方式执行此操作的任何建议。

3 个答案:

答案 0 :(得分:0)

如果您担心在脚本运行时泄漏内存,可以将无限循环移动到只调用脚本的包装器脚本。类似的东西:

<?php
while(1) {
  exec("worker_script.php");
  sleep(15);
} 

答案 1 :(得分:0)

  

问题是,如何智能地执行此操作?在保持记忆的同时。

这种方法听起来不是很糟糕。如果您想确保没有任何内存泄漏,请确保使用本地范围分配所有对象,以确保它不会累积以导致内存不足错误。

我还建议使用像Supervisor这样的守护程序管理程序,以便在崩溃时自动重启PHP进程。

此整个方法的替代方法是每隔几分钟删除while循环并自动启动PHP进程(通过CRON作业或类似工作),并在完成后立即退出。这样做的问题是,现在您必须担心防止两个或多个脚本并行运行。

答案 2 :(得分:0)

您可能希望避免睡眠()。它超时并且可能崩溃,因此Martin关于使用Supervisor或其他重启脚本的进程的评论。此脚本可以避免睡眠和内存使用率低。

defined("RESTART_TIMER") || define("RESTART_TIMER", 15);
$restartTime = time() + RESTART_TIMER;
for (;;) {
   // Most efficient loop possible. 
   if (time() >= $restartTime) {
       exec("yourFile.php");
       $restartTime = time() + RESTART_TIMER;
   }
}

如果您运行php -a,可以通过粘贴来尝试:

defined("RESTART_TIMER") || define("RESTART_TIMER", 1);
$restartTime = time() + RESTART_TIMER;
for (;;) {
   // Most efficient loop possible. 
   if (time() >= $restartTime) {
       echo memory_get_usage(true) . PHP_EOL;
       $restartTime = time() + RESTART_TIMER;
   }
}

当你累了的时候按ctrl-c退出它,但内存使用量是不变的。