Цитата:
Вы например не делаете обязательного закрытия пайпов, без чего дочерний процесс может как раз зависнуть - это прямо написано в описании php_close.
Спасибо за совет. Я не обратил внимание на это.
Еще проблема возникла. Программа dvipng самоуничтожается, устанавливая в статус [running] => 0, а программа latex, видимо, нет. У него в статусе [running] => 1 установлен до конца, до убийства по таймауту. Может он не убивается и живет сам по себе как демон, принимая запросы? Как же в shell_exec() определяется, что пора выходить? Видимо, в shell_exec() ожидается вывод внешней программы.
Может как-то использовать stream_select. Так будет корректно работать? Не произойдет ли убийство раньше времени?
Код:
$pipes = array();
$options = array(
0 => array('pipe', 'r'),
1 => array('pipe', 'w'),
2 => array('pipe', 'w')
);
$pid = proc_open( $cmd, $options, $pipes, $cwd );
$r_stms = array( $pipes[1], $pipes[2] );
$w_stms = NULL;
$e_stms = NULL;
stream_select( $r_stms, $w_stms, $e_stms, $timelimit );
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($pid);