将始终开启的 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 进程的主要内容,如果未能解决你的问题,请参考以下文章