如何在php中通过外部命令传递变量的内容?

如何在php中通过外部命令传递变量的内容?,php,popen,passthru,Php,Popen,Passthru,我有一个包含长字符串的变量。(具体来说,它包含几千字节的javascript代码) 我想通过一个外部命令传递这个字符串,在本例中是一个javascript压缩器,并在php中捕获外部命令(压缩的javascript)的输出,将其分配给一个变量 我知道php中有压缩javascript的类,但这只是一个一般问题的示例 我们最初使用: $newvar = passthru("echo $oldvar | compressor"); 这适用于小字符串,但不安全。(如果oldvar包含对shell有特

我有一个包含长字符串的变量。(具体来说,它包含几千字节的javascript代码)

我想通过一个外部命令传递这个字符串,在本例中是一个javascript压缩器,并在php中捕获外部命令(压缩的javascript)的输出,将其分配给一个变量

我知道php中有压缩javascript的类,但这只是一个一般问题的示例

我们最初使用:

$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可能以某种方式解决了这个问题,但是如果您计划发送(或接收)的数据超过管道中的容量,那么就值得进行测试