我正在开发一个需要使用 PHP 执行 jar 文件的项目,我正在使用 php exec 函数来执行 jar 文件,当我从浏览器执行我的 php 脚本时,我得到了预期的输出,但是当我从命令行执行时,我得到了预期的输出。收到错误“无法访问 jarfilewrapper.jar”。
我的 php 脚本具有以下代码:
exec("java -jar wrapper.jar $arr[0] $arr[1] $arr[2] $arr[3] $arr[4] $arr[5] $arr[6] $arr[7] $arr[8] $arr[9]",$output);
PHP 脚本和 jar 文件wrapper.jar 都在同一目录中,请检查下面的输出:
从浏览器执行时
数组 ( [0] => REFNUM : 1258740043092402176 [1] => ANumber : null [2] => 状态 : y [3] => Txn : cf77bd77-f365-475f-b9ba-814f16f3a123 )
预期输出
从命令行执行时
错误:无法访问 jarfilewrapper.jar 输出:数组 ( )
因为它是 CLI,我还更改了代码以提供 jar 文件的绝对路径,如下所示:
exec("java -jar 'D:\xampp\htdocs\AVAULT\wrapper.jar' $arr[0] $arr[1] $arr[2] $arr[3] $arr[4] $arr[5] $arr[6] $arr[7] $arr[8] $arr[9]",$output);
我得到以下输出:
Error: Unable to access jarfile wrapper.jar OUTPUT: Array ( )
我还检查了
exec('java -version',$output)
,它在浏览器和命令行上显示了我的系统上安装的正确java版本
我还注意到,当在 exec 函数中使用单引号和双引号时,它的行为有所不同
带双引号(在浏览器中)
exec("java -jar wrapper.jar $arr[0] $arr[1] $arr[2] $arr[3] $arr[4] $arr[5] $arr[6] $arr[7] $arr[8] $arr[9]",$output);
输出:
Array ( [0] => REFNUM : 1258740043092402176 [1] => ANumber : null [2] => Status : y [3] => Txn : 01bac91a-9dd5-4886-9ca1-2166233af827 )
带单引号(在浏览器中)
exec('java -jar wrapper.jar $arr[0] $arr[1] $arr[2] $arr[3] $arr[4] $arr[5] $arr[6] $arr[7] $arr[8] $arr[9]',$output);
输出:
Array ( [0] => ERROR : MISMATCH_AC_SA [1] => Status : n [2] => ANumber : Null [3] => Txn : ec883e3f-e8e7-4feb-ac37-9ce9f36d3d0b )
我不知道为什么单引号和双引号的行为不同。
但是我的实际要求是从 php 命令行执行 jar 文件。
我真的很困惑
在评论者的帮助下,我能够解决问题。 您必须注意,使用 php 命令行,路径必须是绝对路径,下面的代码对我有用。请注意,必须转义反斜杠
exec("java -jar D:\\xampp\\htdocs\\AVAULT\\wrapper.jar $arr[0] $arr[1] $arr[2] $arr[3] $arr[4] $arr[5] $arr[6] $arr[7] $arr[8] $arr[9]",$output);
请注意,如果您在 exec 函数中传递任何 php 变量,请勿使用单引号,例如:
exec('java -jar D:\\xampp\\htdocs\\AVAULT\\wrapper.jar $arr[0] $arr[1] $arr[2] $arr[3] $arr[4] $arr[5] $arr[6] $arr[7] $arr[8] $arr[9]',$output);
使用单引号 php 变量将被视为字符串,您将得到意想不到的输出,有关 PHP 中单引号和双引号的更多详细信息可以找到这里