我想执行一个命令,它会提示我输入一些内容。
我可以通过试用来解决这个问题。错误,但最好的方法是什么?
答案 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()
,它允许双向通信。