【问题标题】:PHP process that will always be on将始终开启的 PHP 进程
【发布时间】:2016-05-06 16:10:54
【问题描述】:

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

代码已编写并且可以正常运行。问题是,您如何智能地执行此操作?在有记忆意识的同时。

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

【问题讨论】:

  • 回到大型机时代,CICS 需要一种编程风格,在需要时程序会终止并重新启动,并会出现“现在,我在做什么?”的问题。事实证明,它具有高度可扩展性,因此如果您使用更简单的方法遇到资源问题,您可能需要考虑这种方法。
  • 考虑检查像 PHP-Daemon 这样的项目 - github.com/shaneharter/PHP-Daemon - “通过扩展 Core_Daemon 类创建可靠的、长时间运行的 PHP 守护进程。” “创建传统的单进程应用程序或在 PHP 中使用持久的后台工作人员选择真正的并行处理。”

标签: php python mysql long-running-processes


【解决方案1】:

问题是,您如何智能地执行此操作?在有记忆意识的同时。

这种方法听起来并没有太大的问题。如果要确保没有任何内存泄漏,请确保将所有对象分配到本地范围,以确保它不会累积导致内存不足错误。

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

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

【讨论】:

    【解决方案2】:

    如果您担心脚本运行时内存泄漏,您可以将无限循环移至仅调用您的脚本的包装脚本。比如:

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

    【讨论】:

      【解决方案3】:

      你可能想避免 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 退出,但内存使用量不变。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-28
        相关资源
        最近更新 更多