如何执行外部程序,将数据发送到STDIN并捕获STDOUT?

时间:2019-01-24 21:08:25

标签: php popen

在我的PHP脚本中,我有一个变量$pkcs7_bin,我想通过openssl进行转换。

假设我在文件中输入了内容,则可以使用bash进行此操作:

cat in.pkcs7 | openssl pkcs7 -inform DER > out.pkcs7

我想在PHP中做同样的事情,例如:

$exit_status execute('openssl pkc7 -inform DER', $pkcs7_bin, $pkcs7_out);

我当然不想使用中间文件。

这是一种简单的方法吗?

目前我已经写过:

function execute($process, $stdin, &$stdout)
{
    ob_start();
    $handle = popen($process, 'w');
    $write = fwrite($handle, $stdin)
    &$stdout = ob_get_clean();
    pclose($handle);
}

但是我意识到ob_start:(

2 个答案:

答案 0 :(得分:-1)

据我所知,您只需要fread()fwrite()

Other places I've seenand here too)似乎都为此目的使用了fread()和fwrite()。否需要ob_start()。

ob_start()用于output buffering,这完全是另外一回事。

答案 1 :(得分:-1)

对于控制台命令的一般用法,您需要使用shell_exec()-通过shell执行命令并以字符串形式返回完整输出

请注意,在您的用例中,PHP提供的OpenSSL函数可以“本机”完成您需要做的事情,而不必担心生成外壳程序(出于安全原因通常被禁用)

无论如何,回到shell_exec():

cat in.pkcs7 | openssl pkcs7 -inform DER > out.pkcs7

可以按照     //以某种方式获取输入数据。你可以     // shell_exec使用正确的原始命令     //文件路径,然后使用file_get_contents()读出.pkcs7     $ infile = file_get_contents(“ / path / to / in.pcks7”);     $ result = shell_exec(“ echo”。$ infile。“ | openssl pcks7-通知DER”);

5月/将/确实需要与"'进行周刊处理,以处理$infile内容中的特殊字符。将$infile更改为您将要发送的任何输入,只要有需要,请确保正确引用/转义。