Используя предложение rumpels, я смог придумать следующее решение, которое, кажется, работает хорошо. Размещать его здесь в интересах всех, кто интересуется этим вопросом.
public static function extFilter($command, $content){
$fds = 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("pipe", "w") // stderr is a pipe that the child will write to
);
$process = proc_open($command, $fds, $pipes, NULL, NULL);
if (is_resource($process)) {
fwrite($pipes[0], $content);
fclose($pipes[0]);
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
$return_value = proc_close($process);
// Do whatever you want to do with $stderr and the commands exit-code.
} else {
// Do whatever you want to do if the command fails to start
}
return $stdout;
}
Могут возникать проблемы взаимоблокировки: если отправляемые вами данные превышают объединенные размеры каналов, тогда внешняя команда будет блокироваться, ожидая, что кто-то прочтет ее стандартный вывод, в то время как php заблокирован, ожидая, пока стандартный вывод быть прочитанным, чтобы освободить место для дополнительной информации.
Возможно, PHP как-то решит эту проблему, но стоит проверить, если вы планируете отправлять (или получать) больше данных, чем умещается в каналах.