1

我使用以下代码使用 proc_open 打开进程,并将句柄和管道保存到文件中:

    $command = "COMMAND_TO_EXECUTE";

    $descriptors = array(
        0 => array("pipe", "r"), // stdin is a pipe that the child will read from
        1 => array("pipe", "w"), // stdout is a pipe that the child will write to
        2 => array("file", "error-output.txt", "a")  // stderr is a file to write to
    );


    $pipes = array();

    $processHandle = proc_open($command, $descriptors, $pipes);

    if (is_resource($processHandle)) {     

        $processToSave = array(
            "process" => $processHandle,
            "pipes" => $pipes
        );

        file_put_contents("myfile.bin", serialize($processToSave) );        

    }

然后我需要从文件中检索这个文件句柄,我使用了这个代码:

$processArray = unserialize(file_get_contents("myfile.bin"));  
$processHandle = $processArray["process"];
$pipes = $processArray["pipes"];

但是,当我在从文件中检索后打印 $processHandle 和 $pipes 的 var_dump 时,我会得到整数而不是资源或进程,但是为什么呢?

 var_dump($processHandle) ->  int(0)
 var_dump($pipes) - > array(2) { int(0), int(0) }

当然,在这一点上,如果我尝试关闭管道,我会得到一个错误,资源预期,给定整数。

我怎样才能使它工作?(注意:这是我正在寻找的解决方案)

但或者,我也可以获取进程的 pid,然后使用这个 pid 来停止或杀死进程或对进程执行任何其他操作,但是管道呢?如何从/向进程读取/写入或保存错误?

谢谢

4

1 回答 1

1

找到了自己的解决方案,不可能序列化资源,当脚本完成后,那些资源处理程序是免费的。

解决方案是创建一个监听端口的守护进程,它会根据请求启动和停止进程。因为进程一直在运行,它可以维护一个处理程序进程列表,并在请求时停止。

于 2015-07-29T15:22:07.687 回答