在 php 中运行仅在尚未运行时才运行的连续循环的最佳方法是啥?

Posted

技术标签:

【中文标题】在 php 中运行仅在尚未运行时才运行的连续循环的最佳方法是啥?【英文标题】:What is the best way to run a continuous loop in php that only runs if it's not already running?在 php 中运行仅在尚未运行时才运行的连续循环的最佳方法是什么? 【发布时间】:2020-02-07 05:05:56 【问题描述】:

Ubuntu 18.04 上的 LAMP 堆栈:

我有一个想要持续运行的 php 循环。据我了解,Apache 将为每个正在执行的脚本生成一个线程并为其提供一个核心,这实际上是我想做的:拥有一个不断循环的 php 脚本,根据需要处理事情。

我见过每分钟运行一个 cron 的方法,它创建一个文件,然后在完成后将其删除,但是当脚本需要 61 秒执行然后它只是坐在那里 59 秒不做任何事情时会发生什么。或者如果脚本崩溃并且没有删除文件。

在做错之前,我想弄清楚正确的方法是什么。

【问题讨论】:

描述你尝试用一些无限循环解决的真正问题。 听起来您正在尝试运行一个长时间运行的轮询脚本,以便在它到达时进行工作。有很多方法可以做到这一点,但没有一个涉及 Apache。您最好的选择是使用作业服务器来排队您的作业。我喜欢 beanstalkd,但几乎任何工作队列都足够了。所有长时间运行的作业都应作为服务在命令行上启动,最好使用 pcntl 或 pthreads 扩展。如果你想要一个示例项目,我将它放在一起用于 beanstalkd:github.com/kwhat/legume 【参考方案1】:

对我来说,听起来您想使用 apache 和 mod_php 重新发明事件驱动模型,它们不是为事件驱动模型创建的。 如果您想坚持使用 php,我建议您只在控制台中运行 php_cli 脚本(与 Apache 无关)(可能作为 systemd 服务)。当它启动时,它应该验证它尚未启动。或者您可以使用 .lock 或 .pid 文件。

【讨论】:

我想了解更多关于这种方法的信息。我只将 php 与 apache 一起使用,所以我完全不知道其他可用的选项。有没有教程或入门指南可以指点我? 有一个 php cli 解释器,其运行方式与 mod_php 和 fcgi php 大致相同。您可以使用php -f script.php 从命令行运行 PHP,并执行您可以使用 mod_php 执行的所有操作以及一些额外的操作。更多关于使用 PHP 作为 Posix 服务的阅读:php.net/manual/en/book.pcntl.php 这不是 PHP 概念;这就是服务信号在 *nix 上的工作方式。我已经给了你一个示例项目。【参考方案2】:

“检查文件是否存在”是一种“好的”方法...您可以使用相同的逻辑将其替换为某个数据库中的一行。

您可以通过检查文件日期(或数据库记录日期)是否早于 1 分钟来避免超时问题。如果是,则上一个进程删除文件失败,您可以删除并重新启动该进程。

【讨论】:

以上是关于在 php 中运行仅在尚未运行时才运行的连续循环的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

仅在设置了特定的弹簧配置文件时才运行集成测试

单击通知行为仅在应用程序在后台运行时才有效?

仅在 Visual Studio 外部运行时才找到文本文件

iOS:推送通知仅在应用程序在前台运行时才有效

我的 PowerShell 脚本仅在从 ISE 运行时才有效

从子进程读取的实时标准输出仅在从 PyCharm 而不是终端运行时才有效