Php proc_open - 将进程句柄保存到文件并检索它
Php proc_open - save process handle to a file and retrieve it
我使用以下代码通过 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"];
但是当我从文件中检索后打印一个 var_dump 的 $processHandle 和 $pipes 时,我得到的是整数而不是资源或进程,但为什么呢??
var_dump($processHandle) -> int(0)
var_dump($pipes) - > array(2) { int(0), int(0) }
当然,此时,如果我尝试关闭管道,我会得到一个错误,需要资源,给定整数。
我怎样才能让它工作? (注意:这是我正在寻找的解决方案)
但或者,我也可以获取进程的 pid,然后使用此 pid 停止或终止进程或对进程执行任何其他操作,但是管道呢?
我如何read/write或保存错误from/to过程?
谢谢
我自己找到了解决方案,序列化资源是不可能的,当脚本完成后,那些资源处理程序是免费的。
解决方案是创建一个监听端口的守护进程,根据请求启动和停止进程。因为进程总是运行,所以它可以维护一个处理程序进程列表并在请求时停止。
我使用以下代码通过 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"];
但是当我从文件中检索后打印一个 var_dump 的 $processHandle 和 $pipes 时,我得到的是整数而不是资源或进程,但为什么呢??
var_dump($processHandle) -> int(0)
var_dump($pipes) - > array(2) { int(0), int(0) }
当然,此时,如果我尝试关闭管道,我会得到一个错误,需要资源,给定整数。
我怎样才能让它工作? (注意:这是我正在寻找的解决方案)
但或者,我也可以获取进程的 pid,然后使用此 pid 停止或终止进程或对进程执行任何其他操作,但是管道呢? 我如何read/write或保存错误from/to过程?
谢谢
我自己找到了解决方案,序列化资源是不可能的,当脚本完成后,那些资源处理程序是免费的。
解决方案是创建一个监听端口的守护进程,根据请求启动和停止进程。因为进程总是运行,所以它可以维护一个处理程序进程列表并在请求时停止。