不要等待进程退出

时间:2008-09-25 21:55:31

标签: php

我有一个PHP脚本,每分钟从一个cron作业调用。此脚本从数据库获取一些信息,然后使用System函数调用另一个PHP脚本(传递一些参数)。

这意味着我可以从这个“主”脚本启动最多10个脚本。我想做的是我会调用脚本并继续执行主脚本,也就是说,不要等待系统调用完成然后调用下一个。

如何做到这一点?

7 个答案:

答案 0 :(得分:3)

您可以一致使用proc_open()stream_select()stream_set_blocking()来实现此类目标。

如果这听起来很模糊,我会在这里粘贴一大块代码,我在最近的项目中使用了类似的东西,但后来觉得它可能会阻碍而不是帮助!总而言之,代码的工作原理如下:

  1. cronjob调用cronjob_wrapper.php
  2. cronjob_wrapper.php创建一个新的Manager类,然后在其上调用 start
  3. Manager类启动方法检查以查看正在运行的实例数(在特定位置查找pid文件)。如果它小于给定的最大实例数,则将其自己的进程ID写入pid文件,然后继续
  4. Manage类创建一个适当的Encoder类的实例,并在其上调用 exec
  5. exec 方法使用proc_open,stream_select和stream_set_blocking以非阻塞方式运行系统命令(在这种情况下运行ffmpeg - 可能需要一段时间!)
  6. 当它最终运行时,它会清理其PID文件并退出。
  7. 现在我变得模糊不清的原因是我们这里的多个实例都是由cronjob而不是PHP处理的。我试图做很多你正在谈论的事情,并且与pcntl_fork()和朋友们相处得很好,但最后我遇到了一些问题(如果我记得至少有一个问题是PHP中的错误,并认为这种方法是一种更加坚如磐石的方式来实现同样的目标。 YMMV。

    值得一看这些功能,你可以用它们实现很多。虽然我不认为PHP会成为首选的套接字编程语言...... :)

答案 1 :(得分:1)

如果您的操作系统支持,您可以使用pcntl_fork()功能来剥离父级不等待的子进程。但是要小心,很容易意外地创建太多的子进程,特别是如果它们花费的时间比预期的要长!

答案 2 :(得分:0)

我不确定PHP是否支持线程化。检查here

答案 3 :(得分:0)

我认为答案与Asynchronous PHP calls已经提供的答案非常相似。

答案 4 :(得分:0)

http://php.net/pcntl_fork

它只是* NIX,但你可以使用PCNTL扩展来分叉你的脚本。

答案 5 :(得分:-1)

使用php的fork或thread版本。

答案 6 :(得分:-1)

您可以在后台运行它们:

system('php yourscript.php &');

您只需确保检查正在运行的进程总数。总而言之,不是一个超级优雅的解决方案。相反,你可以让一个脚本永远运行,我想的是这样的事情:

<?php
while(true) {
  // do whatever needs to be done.
}
?>

虽然小心。众所周知,PHP不能用作守护进程。