Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 管道$\u POST到外部命令_Php_Post_Request_Pipe - Fatal编程技术网

Php 管道$\u POST到外部命令

Php 管道$\u POST到外部命令,php,post,request,pipe,Php,Post,Request,Pipe,我有一个程序可以从stdin中读取JSON请求,我想用PHP调用它。 这是我现在拥有的 <?php echo exec( 'echo \''.json_encode($_POST,JSON_NUMERIC_CHECK).'\' | '. 'program' ); ?> 但是我必须在命令参数中添加LD\u LIBRARY\u PATH=/foo/bar/lib。$env参数似乎没有效果。有人知道原因吗?您可以使用创建流程的管道: <?php $data = json_e

我有一个程序可以从stdin中读取JSON请求,我想用PHP调用它。 这是我现在拥有的

<?php
echo exec(
  'echo \''.json_encode($_POST,JSON_NUMERIC_CHECK).'\' | '.
  'program'
);
?>
但是我必须在命令参数中添加
LD\u LIBRARY\u PATH=/foo/bar/lib
$env
参数似乎没有效果。有人知道原因吗?

您可以使用创建流程的管道:

<?php
$data = json_encode($_POST, JSON_NUMERIC_CHECK);
$p = popen("program", "w");
fwrite($p, $data . PHP_EOL);
$exit_code = pclose($p);

或包含单引号
这就是
escapeshellarg()
的含义。。。那么,我的答案对你有用吗?我觉得你只提供了半个答案。我需要将数据导入和导出,而您的示例仅将其导入。对不起,我不认为我只能接受链接的答案。我给你一票。啊,你的问题没有提到需要产出,所以我只是加了一个脚注。我只是注意到你的编辑;如果你不想接受我的答案,你可以发布你自己的答案,并将其标记为已接受的答案。通常不赞成在打开问题时编辑问题以将其标记为“已解决”。环境数组需要关联,如
[“LD\u LIBRARY\u PATH”=>“/foo/bar/lib”]
<?php
$data = json_encode($_POST, JSON_NUMERIC_CHECK);
$p = popen("program", "w");
fwrite($p, $data . PHP_EOL);
$exit_code = pclose($p);
<?php
$data = json_encode($_POST, JSON_NUMERIC_CHECK);
$fds = [
    0=>["pipe", "r"], // STDIN
    1=>["pipe", "w"], // STDOUT
    2=>["pipe", "w"], // STDERR
];
$dir = "/path/to/working/directory";
$env = [
    "PATH"            => "/usr/local/foo/bin:/usr/local/bin:/usr/bin",
    "LD_LIBRARY_PATH" => "/usr/local/foo/lib/",
];
$p = proc_open("program", $fds, $pipes, $dir, $env);
fwrite($pipes[0], $data . PHP_EOL);
fclose($pipes[0]);
$return = stream_get_contents($pipes[1]);
$err    = stream_get_contents($pipes[2]);
fclose($pipes[1]);
fclose($pipes[2]);
$exit_code = proc_close($p);
if ($exit_code == 0) {
    // successful return
    echo $return;
} else {
    // error
    echo "ERR: $err";
}