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

Php 如何使用system()或exec()执行两阶段命令,php,Php,我想执行一个命令,它会提示我输入一些信息 我可以通过尝试和错误来解决这个问题,但最好的方法是什么 编写一个小的批处理文件并执行(I)该操作 Exec($command.'\r\n'$input) 还有别的吗 exec()不是为交互式程序设计的。为了能够与您的子流程对话,您需要使用,它允许双向通信。exec()不是为交互式程序设计的。为了能够与子流程对话,您需要使用,它允许双向通信。您试图执行的命令是什么?从您留下的评论来看,您似乎在尝试执行PHP本身?(您将C:\xampp\php\php.e

我想执行一个命令,它会提示我输入一些信息

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

  • 编写一个小的批处理文件并执行(I)该操作
  • Exec($command.'\r\n'$input)
  • 还有别的吗

exec()
不是为交互式程序设计的。为了能够与您的子流程对话,您需要使用,它允许双向通信。

exec()
不是为交互式程序设计的。为了能够与子流程对话,您需要使用,它允许双向通信。

您试图执行的命令是什么?从您留下的评论来看,您似乎在尝试执行PHP本身?(您将
C:\xampp\php\php.exe
传递到
proc\u open()

您想在php.exe中执行的任何操作都无需运行可执行文件。当您从web服务器请求
.php
文件时,Apache将调用可执行文件。因此,如果您真的需要运行PHP代码,只需编写代码即可。您不会告诉PHP加载PHP解释器。这就像为说英语的人安排一名英语口译员一样愚蠢

如果您明确告诉我们您试图运行的命令,那么我们可能能够更好地解释如何完成它。我从自己的经验中知道一个例子,我必须使用
proc\u 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通常需要四根管道才能工作。一个用于输入数据(要加密/解密的数据),一个用于输出数据,一个用于错误,一个用于密码


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

您试图执行的命令是什么?从您留下的评论来看,您似乎在尝试执行PHP本身?(您将
C:\xampp\php\php.exe
传递到
proc\u open()

您想在php.exe中执行的任何操作都无需运行可执行文件。当您从web服务器请求
.php
文件时,Apache将调用可执行文件。因此,如果您真的需要运行PHP代码,只需编写代码即可。您不会告诉PHP加载PHP解释器。这就像为说英语的人安排一名英语口译员一样愚蠢

如果您明确告诉我们您试图运行的命令,那么我们可能能够更好地解释如何完成它。我从自己的经验中知道一个例子,我必须使用
proc\u 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通常需要四根管道才能工作。一个用于输入数据(要加密/解密的数据),一个用于输出数据,一个用于错误,一个用于密码


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

这看起来确实是一种解决方法,但我仍在努力让示例正常工作,稍后会回复您。错误文件包含“'php'不被识别为内部或外部命令、可操作程序或批处理文件。”但php.exe在我的windows系统路径中。如果我举个例子并更改为将绝对路径放置到php解释器“$process=proc_open('c:/xampp/php/php.exe',$descriptorspec,$pipes,$cwd,$env);”然后我得到警告:proc_open()[function.proc open]:CreateProcess失败,错误代码-0“错误文件是emptyso,我想我不能把它算作答案。很抱歉但是我非常感谢你的帮助,这看起来确实像是一种方法,但是我仍然在努力让这个例子起作用&我会回复你的。错误文件包含“'php'不被识别为内部或外部命令、可操作程序或批处理文件。”但php.exe在我的windows系统路径中。如果我举个例子并更改为将绝对路径放置到php解释器“$process=proc_open('c:/xampp/php/php.exe',$descriptorspec,$pipes,$cwd,$env);”然后我得到“警告:proc_open()[function.proc open]:CreateProcess失败,错误代码-0”并且错误文件为空。因此,我想我不能将此作为答案。抱歉。但我非常感谢您的帮助