我有一个程序可以读取 JSON 请求stdin
,我想用 PHP 调用它。
这就是我现在所拥有的
<?php
echo exec(
'echo \''.json_encode($_POST,JSON_NUMERIC_CHECK).'\' | '.
'program'
);
?>
这可行,但是有没有更直接的方法将 PHP 中的字符串放入stdin
?
类似的东西pipe(json_encode($_POST,JSON_NUMERIC_CHECK),'program')
maybe?
在这种特殊情况下,我所拥有的可能没问题,但如果我需要管道二进制数据而不是 JSON,该怎么办?如果它太长而无法放入 shell 参数或包含单引号怎么办?
Edit:
下列的miken32 https://stackoverflow.com/users/1255289的建议,我用过proc_open() http://php.net/manual/en/function.proc-open.php像这样:
$proc = proc_open(
'LD_LIBRARY_PATH=/foo/bar/lib program args',
array(0 => array('pipe','r'), 1 => array('pipe','w')),
$pipes,
NULL
//, array('LD_LIBRARY_PATH','/foo/bar/lib')
);
if (is_resource($proc)) {
fwrite($pipes[0],json_encode($_POST,JSON_NUMERIC_CHECK));
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
proc_close($proc);
}
?>
但我必须添加LD_LIBRARY_PATH=/foo/bar/lib
到命令参数。这$env
争论似乎没有效果。有谁知道为什么?