【问题标题】:PHP line pclose(popen(... won't work on Amazon AWS with MAMPPHP 行 pclose(popen(... 无法在带有 MAMP 的 Amazon AWS 上工作
【发布时间】:2016-08-28 16:30:58
【问题描述】:

我已经安装了 MAMP,并且正在运行一个 php 脚本来执行外部程序(jar 和 exe)。一切都在我的本地机器上完美运行。 但是,当我将其全部放在 AWS 实例上时,它只是忽略了 pclose(popen(...)) 行。我得到了两个日志消息并且没有错误。

$command = 'start /B cmd /C '.$this->getCommand().' >NUL 2>NUL';
$this->Log.debug('executing command : '.$command);
pclose(popen($command, 'r'));     
$this->Log.debug('command sent');

我认为这可能是某种权限问题?但我检查了 php.ini 和 Apache 权限,一切看起来都不错。没有告诉 PHP 忽略 popen 命令。

更新: 我在同一位置创建了一个 test.bat 文件

echo Hello, World > donald.txt

这在从 php 调用时执行,所以现在我知道 pclose(popen()) 正在工作。我正在尝试执行的命令是 java - jar ...所以它必须与运行 java 的权限有关?

所以这行得通:

start /B cmd /C D:/programs/test.bat >NUL 2>NUL

但事实并非如此:

start /B cmd /C java -Xmx2048m -jar "D:\programs\program.jar" -pm XXX_YYY -t FULL -flag1 -flag2 -k 23 >NUL 2>NUL

【问题讨论】:

  • 你是用mamp做windows还是mac?
  • 适用于 Windows。一切正常,除了一行
  • getCommand() 的结果是什么?
  • 您的 AWS 实例运行什么操作系统?
  • Windows Server 2012

标签: php amazon-web-services mamp


【解决方案1】:

删除所有不必要的内容,使您的命令如下所示:

$command = 'start /B ' . $this->getCommand();

您不需要任何重定向,因为start /b 将在没有新窗口的情况下启动程序。

我有以下几点:

$cmd = 'start /b php {$file} {$bid}';
pclose(popen($cmd, 'r'));

它可以完美地在 Windows 上运行。

顺便说一句,对于基于 Linux 的机器,您需要运行如下命令:

$command = $this->getCommand() . ' &';

要使一个脚本在 windowsLinux 上运行,您需要这样的东西:

$command = $this->getCommand() . ' &';
if (false !== stripos(PHP_OS, 'win')) {
    $command = 'start /B ' . $this->getCommand();
}
$this->Log.debug('executing command : '.$command);
$p = popen($command, 'r');
sleep(10); //we will give some time for process to start
pclose($p);
$this->Log.debug('command sent');

更新:在聊天中我们发现问题出在java.exe 的路径上。 Apache 无法找到 java 可执行文件。所以解决方案是指定java.exe的绝对路径:

$command = 'start /B C:/Progra~1/Java/jre1.8.0_102/bin/java.exe -Xmx2048m -jar "C:/programs/some-jar-file.jar" -?';

【讨论】:

  • 我刚试过,它没有通过 pclose(popen($command, 'r'));线。我没有运行外部 php 文件,而是运行 java 程序。我的命令是 java -jar path_to_file。一切都在我的本地 Windows 机器上完美运行。当它在运行 Microsoft Windows Server 2012 的 AWS 上时,它没有运行。
  • 您是否尝试从命令行在您的服务器上运行您的命令?运行良好吗?
  • 是的,尝试通过cmd.exe运行它,它运行完美。
  • 哦...尝试在您的命令中将java 更改为javaw...看,您启动的进程会立即被终止,因此您的java 命令不会运行... javaw 在没有 dos 窗口的情况下启动进程。
  • 刚刚尝试过,没有运气。我在(“正在尝试”)之前有一个日志,在(“已发送”)之后有一个日志,它没有挂在 pclose(...) 行上,只是直接通过它,就好像没有任何问题一样。我正在调用的程序会创建一个日志和锁定文件(同样,通过命令行使用完全相同的完整命令字符串运行良好)。所以我可以判断它何时运行或不运行。
猜你喜欢
  • 2011-10-25
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 2014-05-08
  • 2012-12-16
  • 2017-07-12
相关资源
最近更新 更多