代码之家  ›  专栏  ›  技术社区  ›  Jan Hančič

不要等待进程退出

php
  •  1
  • Jan Hančič  · 技术社区  · 17 年前

    我有一个PHP脚本,它每分钟都从cron作业调用一次。该脚本从数据库获取一些信息,然后使用系统函数调用另一个PHP脚本(向其传递一些参数)。

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

    如何做到这一点?

    7 回复  |  直到 17 年前
        1
  •  3
  •   NullUserException Mark Roddy    14 年前

    你可以使用 proc_open() , stream_select() stream_set_blocking() 为了达成这样的目标,我们齐心协力。

    1. cronjob调用cronjob_wrapper.php
    2. cronjob_wrapper.php创建一个新的管理器类,然后调用 开始 在上面。
    3. Manager类开始方法检查有多少实例正在运行(在特定位置查找pid文件)。如果少于给定的最大实例数,它会将自己的进程id写入pid文件,然后继续执行
    4. 执行官
    5. 这个 执行官
    6. 当它最终运行时,它会清理其PID文件并退出。

    现在,我之所以含糊其辞并使用handwavy,是因为我们这里的多个实例是由cronjob而不是PHP处理的。我试着做了很多你正在谈论的事情,并且得到了一些很好的工作 pcntl_fork()

    不过,值得一看这些函数,您可以使用它们实现很多功能。尽管不知何故,我认为PHP永远不会成为sockets编程语言的首选……:)

        2
  •  1
  •   Mark Biek    17 年前

    pcntl_fork() 函数派生父进程不等待的子进程。但是要小心,很容易意外地创建太多的子进程,尤其是如果它们运行的时间比预期的长!

        3
  •  0
  •   Community Mohan Dere    9 年前
        4
  •  0
  •   dcousineau    17 年前

    http://php.net/pcntl_fork

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

        5
  •  -1
  •   EBGreen    17 年前
        6
  •  -1
  •   Till    17 年前

    您可以在后台运行它们:

    system('php yourscript.php &');
    

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

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

        7
  •  -2
  •   J.J.    17 年前

    推荐文章