如何使用system()或exec()执行两阶段命令

时间:2010-11-29 00:53:41

标签: php

我想执行一个命令,它会提示我输入一些内容。

我可以通过试用来解决这个问题。错误,但最好的方法是什么?

  • 写一个小批处理文件和Exec(I)那个?
  • Exec($ command。'\ r \ n'。$ input);
  • 还有别的吗?

2 个答案:

答案 0 :(得分:2)

您尝试执行的命令是什么?从你留下的评论听起来你正试图执行PHP本身? (您已将C:\xampp\php\php.exe传递给proc_open()

您可以在php.exe中执行任何操作,而无需运行可执行文件。当您从Web服务器请求.php文件时,Apache会调用可执行文件。因此,如果您确实需要运行PHP代码,那么您只需编写代码即可。你不会告诉PHP加载PHP解释器。这将是愚蠢的=)就像为英语发言者提供英语口译员。

如果您具体告诉我们您正在尝试运行的命令,那么我们可以提供更好的解释如何完成它。我从自己的经验中知道一个例子,我必须使用proc_open()来加密GPG文件。

$descriptors = array(
    0 => array("pipe", "r"), // STDIN. Used to feed input
    1 => array("pipe", "r"), // STDOUT. We are writing to it, though
    2 => array("pipe", "w"), // STDERR. Used to read errors
);
// Build the command line and start the process
$cmd = '"C:/program files/gnu/gnupg/gpg.exe" --batch --no-verbose --passphrase-fd 1 --output decrypted.zip --decrypt encrypted.zip.gpg';
$gpg = proc_open( $cmd, $descriptors, $pipes);
if(is_resource($gpg)) {
    // Push passphrase to custom pipe
    fwrite($pipes[1], $passphrase);
    fclose($pipes[1]);
    proc_close($gpg);
}

请注意,对于STDOUT,它说“我们正在写它”。这段代码实际上是我解决Windows中的一个问题(Vista和XP。不确定7是否修复了它)。 Windows只允许3个管道与命令行程序通信,而UNIX允许创建更多(我认为256或其他)。 GPG通常需要四个管道才能工作。一个用于输入数据(要加密/解密的数据),一个用于输出数据,一个用于错误,一个用于密码。

由于我正在解密文件,我不需要查看程序的输出,我只需要查看是否有错误。没有错误意味着可以在文件中找到输出。因此我忽略了输出管道并用它来发送密码。根据您的使用情况,您可能不需要这么棘手的解决方案。

答案 1 :(得分:1)

exec()不适用于交互式程序。为了能够与您的子流程进行通信,您需要使用proc_open(),它允许双向通信。