过去,我将一堆脚本作为单独的cron作业运行。现在我想用一个cron作业运行一个控制器脚本,然后分别调用这些脚本(并且同时调用所有脚本),所以每次添加时我都不必创建一个新的cron作业另一个剧本。
我查了pcntl_fork()
,但我们没有安装。 fsockopen()
也可以这样做吗?
几个问题:
我看到了这个使用fsockopen()
的示例http://phplens.com/phpeverywhere/?q=node/view/254。这是否允许我并行运行PHP脚本?请注意,脚本不会交互,但我仍然想知道它们中是否有任何一个过早退出并出现错误。
其次,我正在运行的脚本无法从外部访问,它们仅在内部。该脚本以前运行如下: php -f /path/to/my/script1.php 。它不是一个可通过Web访问的路径。 #1中的示例是否可以使用此路径,或仅使用可通过Web访问的路径?
感谢您提供任何建议。
答案 0 :(得分:1)
您可以使用proc_open运行多个进程,而无需等待每个进程完成。 您将拥有一个流程句柄,您可以随时终止每个流程,并且您可以阅读每个流程的标准输出。
您也可以通过管道进行通信,这是可选的。
传递第一个参数php /your/path/to/script.php param1 "param2 x"
意味着启动一个单独的PHP进程。
最终你会想要使用无限循环+ usleep(或睡眠)来避免最大化CPU。在所有进程完成时或在您杀死它们之后中断。
编辑:您可以知道某个流程是否已过早退出。
Edit2:执行上述操作的更简单方法是popen
答案 1 :(得分:1)
如果我错了,请纠正我,但如果我理解正确,Tiberiu-Ionut Stan提出的解决方案暗示用proc_open启动进程并等待它们完成将不会作为cron脚本运行,而是正在运行的程序/服务的一部分,对吧?
据我了解cron作业,控制器脚本user920050考虑使用将由cron按计划启动,每个新实例将重新启动进程,等待它们完成并可能运行与其他cron启动的控制器脚本实例并行。