将始终开启的 PHP 进程

Posted

技术标签:

【中文标题】将始终开启的 PHP 进程【英文标题】:PHP process that will always be on 【发布时间】: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 中使用持久的后台工作人员选择真正的并行处理。” 【参考方案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 退出,但内存使用量不变。

【讨论】:

以上是关于将始终开启的 PHP 进程的主要内容,如果未能解决你的问题,请参考以下文章

php开启子进程处理

怎样在Ubuntu下开启PHP的pnctl进程管理扩展

swoole进程详解

swoole进程详解

始终开启的 *** 以编程方式打开 android

php开启redis扩展