如何在php中通过外部命令传递变量的内容?
我有一个包含长字符串的变量。(具体来说,它包含几千字节的javascript代码) 我想通过一个外部命令传递这个字符串,在本例中是一个javascript压缩器,并在php中捕获外部命令(压缩的javascript)的输出,将其分配给一个变量 我知道php中有压缩javascript的类,但这只是一个一般问题的示例 我们最初使用:如何在php中通过外部命令传递变量的内容?,php,popen,passthru,Php,Popen,Passthru,我有一个包含长字符串的变量。(具体来说,它包含几千字节的javascript代码) 我想通过一个外部命令传递这个字符串,在本例中是一个javascript压缩器,并在php中捕获外部命令(压缩的javascript)的输出,将其分配给一个变量 我知道php中有压缩javascript的类,但这只是一个一般问题的示例 我们最初使用: $newvar = passthru("echo $oldvar | compressor"); 这适用于小字符串,但不安全。(如果oldvar包含对shell有特
$newvar = passthru("echo $oldvar | compressor");
这适用于小字符串,但不安全。(如果oldvar包含对shell有特殊意义的字符,那么任何事情都可能发生)
使用escapeshellarg进行转义修复了这一问题,但由于操作系统对最大允许参数长度的限制,解决方案会中断更长的字符串
我尝试使用popen(“command”“w”)
并向该命令写入数据-这是可行的,但命令的输出会自动消失在空白中
从概念上讲,我只想做以下等效工作:
$newvar = external_command($oldvar);
使用-函数,您可以获取进程的stdout和stdin的句柄,从而将数据写入其中并读取结果。使用Rumples建议,我能够设置以下解决方案,该解决方案似乎运行良好。把它贴在这里是为了其他对这个问题感兴趣的人
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可能以某种方式解决了这个问题,但是如果您计划发送(或接收)的数据超过管道中的容量,那么就值得进行测试