2012-05-30 146 views
0

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

我抬头看看pcntl_fork()但我们没有安装。 fsockopen()也可以这样做吗?

几个问题:

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

  2. 其次,我运行的脚本不能从外部访问,它们只在内部使用。该脚本以前运行如下:php -f /path/to/my/script1.php。这不是一个网络可访问的路径。 #1中的示例是否可以使用此功能,或者只能使用网络可访问的路径?

感谢您提供任何建议。

+1

由于sockopen通过连接到服务器侦听来工作,如果这些文件不可通过网络访问,则无法使用它来访问它们。 –

+0

提示 - 预计长时间运行的脚本可能会崩溃,并计划重新启动/恢复。 – goat

回答

1

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

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

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

proc_open (see Example #1)

最终你会希望使用一个无限while循环+ usleep(或休眠),以避免在CPU上尽了全力。所有进程完成时或在杀死它们后中断。

编辑:你可以知道一个过程是否过早退出。

EDIT2:上面做的简单的方法是popen

+0

我也可以使用exec()并行运行进程吗?如果你在后台运行它,那是平行的,对吧? –

+0

不,exec等待过程完成,并且您无法控制它。您可以运行一个进程,但不能并行运行多个进程。 –

+0

PHP.net这样说: “如果一个程序是用这个函数启动的,为了让它继续在后台运行,程序的输出必须被重定向到一个文件或另一个输出流,否则将会失败导致PHP挂起,直到程序执行结束。“ 所以我应该能够并行运行,对吧? 但是我能看到它们什么时候完成? –

1

请纠正我,如果我错了,但如果我理解正确的事情,Tiberiu-约努茨斯坦提出的解决方案意味着开始proc_open的过程和等待它们完成将不会作为cron脚本运行,而是正在运行的程序/服务的一部分,对吗?

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