【问题标题】:Running Cron jobs in parallel (PHP)并行运行 Cron 作业 (PHP)
【发布时间】:2014-11-12 12:43:49
【问题描述】:

过去,我将一堆脚本作为单独的 cron 作业运行。现在我想用一个 cron 作业运行一个控制器脚本,然后分别调用这些脚本(并且并行地,同时),所以我不必每次添加时都创建一个新的 cron 作业另一个脚本。

我查了pcntl_fork(),但我们没有安装它。 fsockopen()也可以这样做吗?

几个问题:

  1. 我看到了这个例子,http://phplens.com/phpeverywhere/?q=node/view/254,它使用了fsockopen()。这是否允许我并行运行 PHP 脚本?请注意,这些脚本不会交互,但我仍然想知道它们中的任何一个是否因错误而过早退出。

  2. 其次,我正在运行的脚本不能从外部访问,它们只能在内部访问。该脚本之前是这样运行的:php -f /path/to/my/script1.php。这不是网络可访问的路径。 #1 中的示例是否适用于此,或仅适用于 Web 可访问的路径?

感谢您提供的任何建议。

【问题讨论】:

  • 由于 sockopen 通过连接到侦听服务器来工作,如果文件无法通过网络访问,则无法使用它来访问它们。
  • 提示 - 预计长时间运行的脚本可能会崩溃,并计划重新启动/恢复。

标签: php parallel-processing cron fork


【解决方案1】:

您可以使用 proc_open 运行多个进程,而无需等待每个进程完成。 你会有一个进程句柄,你可以随时终止每个进程,并且可以读取每个进程的标准输出。

您也可以通过管道进行通信,这是可选的。

传递第一个参数 php /your/path/to/script.php param1 "param2 x" 意味着启动一个单独的 PHP 进程。

proc_open (see Example #1)

最终,您将希望使用无限 while 循环 + usleep(或睡眠)来避免 CPU 消耗殆尽。当所有进程完成时中断,或者在你杀死它们之后中断。

编辑:您可以知道进程是否过早退出。

Edit2:执行上述操作的更简单方法是popen

【讨论】:

  • 我也可以使用 exec() 来并行运行进程吗?如果你在后台运行它,那是并行的,对吧?
  • 不,exec 等待进程完成,您无法控制它。您可以运行一个进程,但不能并行运行多个进程。
  • PHP.net 说:“如果一个程序使用这个函数启动,为了让它在后台继续运行,程序的输出必须重定向到一个文件或另一个输出流. 不这样做会导致 PHP 挂起,直到程序执行结束。”所以我应该能够并行运行,对吧?但是我能看到它们什么时候完成吗?
  • 如果允许这种特殊的输出重定向(可能在 Linux 上)。然而,这是一个糟糕而繁琐的解决方案,虽然它不是必需的(你没有进程的句柄来检查进程是否仍在运行,你不知道它何时完成检查输出,你可以' t杀死它或找出它的PID)。 popen 和 proc_open 非常出色,非常适合您的需求。
【解决方案2】:

如果我错了,请纠正我,但如果我理解正确,Tiberiu-Ionut Stan 提出的解决方案意味着使用 proc_open 启动进程并等待它们完成不会作为 cron 脚本运行,而是正在运行的程序/服务的一部分,对吧?

据我了解 cron 作业,用户 920050 正在考虑使用的控制器脚本将由 cron 按计划启动,每个新实例都会重新启动进程,等待它们完成并可能运行与控制器脚本的其他 cron 启动实例并行。

【讨论】:

    猜你喜欢
    • 2017-11-10
    • 2010-09-12
    • 1970-01-01
    • 2018-05-13
    • 2015-01-11
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多