代码之家  ›  专栏  ›  技术社区  ›  Asa Ayers

如何同时捕获后台PHP进程的PID和输出?

  •  0
  • Asa Ayers  · 技术社区  · 14 年前

    // RedirectToLog.php just reads stdin and logs it to the databse.
    $cmd="php child.php </dev/null 2>&1 | php RedirectToLog.php >/dev/null 2>&1 & echo $!";
    

    这里的问题是美元!是在后台启动的最后一个进程的PID,该进程最终被重定向到log.php而不是child.php。

    我的另一个想法是尝试使用FIFO文件(管道)。

    $cmd1="php RedirectToLog.php </tmp/myFIFO >/dev/null 2>&1 &"
    $cmd2="php child.php </dev/null >/tmp/myFIFO 2>&1 & echo $!"
    

    这一个不起作用,因为我无法让RedirectToLog可靠地使用fifo,当它这样做时,有时child.php无法将EOF写入管道,这使得两端等待另一端,两个进程都将挂起,直到一个进程被杀死。

    3 回复  |  直到 14 年前
        1
  •  1
  •   mvds    14 年前

    使用 proc_open 在启动进程时获得完整的fd连接。获取返回的资源 过程打开 使用 proc_get_status 获取pid。

    $descriptors = array( ... ); // i suggest you read php.net on this
    $pipes = array();
    $res = proc_open($cmd,$descriptors,$pipes);
    
    $info = proc_get_status($res);
    echo $info['pid'];
    

    我还没有完全理解你所有的问题,但这应该能让你开始。

        2
  •  1
  •   sberry    14 年前
        3
  •  1
  •   Kris    14 年前

    我猜你想要捕捉孩子的PID的唯一原因就是监视它。如果是这样的话,它可能更容易使用 proc_open . 这样,您基本上可以打开stdin、stdout和stderr的文件句柄,并从父级监视所有内容。