PHP 永远开启的进程

PHP process that will always be on

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

代码写好了,可以正常运行了。问题是,您如何智能地执行此操作?同时保持记忆意识。

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

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

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

The question is, how do you execute this intelligently? While being memory conscious.

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

我还建议使用 Supervisor 之类的守护程序主管,以便在 PHP 进程崩溃时自动重启它。

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

您可能希望避免使用 sleep()。它会超时并可能崩溃,因此 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退出,但内存占用不变