Я использую следующий код, чтобы открыть процесс с помощью 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 и $ pipe после извлечения из файла, я получаю целые числа вместо ресурса или процесса, но почему ??
var_dump($processHandle) -> int(0)
var_dump($pipes) - > array(2) { int(0), int(0) }
И в этот момент, конечно, если я попытаюсь закрыть каналы, я получу ошибку, ожидаемый ресурс, заданное целое число.
Как я могу заставить это работать? (ПРИМЕЧАНИЕ: это решение, которое я ищу)
Но в качестве альтернативы я могу также получить pid процесса и затем использовать этот pid, чтобы остановить или уничтожить или сделать что-то еще с процессом, но как насчет каналов?
Как я могу прочитать / записать или сохранить ошибку из / в процесс?
Спасибо
Нашел решение для себя, что невозможно сериализовать ресурс, и когда скрипт закончил, обработчик ресурса был свободен.
Решением было создание демона, прослушивающего порт, который по запросу запускает и останавливает процесс. Поскольку процесс всегда выполняется, он может вести список процессов-обработчиков и останавливаться по запросу.
Других решений пока нет …