我正在尝试从shell脚本生成Android apk
文件,我想从PHP执行shell脚本文件。当我在终端中运行shell脚本时,它完美地运行。如果我尝试使用PHP运行脚本,则shell脚本不会执行所有命令。 shell脚本中的 ls 命令工作正常,但在使用PHP执行时,其他命令不起作用。我在Linux环境中使用xampp服务器。
我的shell脚本
cd /home/user/AndroidStudioProjects/msvep4247-inghamautogroup-pulse-and/
./gradlew assembleDebug
cp -fr app/build/outputs/apk/app-debug.apk /opt/lampp/htdocs/sample/apk
ls
Shell脚本ls
输出
app autolead_data_format.pdf build build.gradle cheek gradle gradle.properties gradlew gradlew.bat lib local.properties msvep4247-inghamautogroup-pulse-and.iml settings.gradle
我的PHP脚本
<?php
echo shell_exec('ls');
echo shell_exec('./generateApk.sh');
?>
PHP脚本ls
输出
generateApk.sh generate.php APK
注意:ls
输出文件夹
我在xampp服务器中设置了shell脚本的所有文件权限。任何人都可以描述我错在哪里吗?等待回复...
答案 0 :(得分:11)
只需使用脚本/可执行文件的完整路径,因为从php运行时环境不同。
答案 1 :(得分:3)
在Web服务器中执行的PHP代码中的PATH
环境变量似乎比您正在使用的shell中的环境变量更有限。但您可以在PHP中更改环境变量,以及命令你从它开始会看到这些变化。
<?php
// set content type so the output is more readable in the browser
header('Content-Type: text/plain');
// set $PATH to some limited value
putenv('PATH=/bin:/sbin');
// verify, note that we have to use full path to 'env'
print(shell_exec("/usr/bin/env|grep '^PATH='"));
// this command won't run (assuming its full path is /usr/bin/id)
print(shell_exec("id"));
// add more directories to $PATH
putenv('PATH=/bin:/sbin:/usr/bin:/usr/sbin');
// verify again, we can use env without specifying the path this time
print(shell_exec("env|grep '^PATH='"));
// this command will
print(shell_exec("id"));
所以你必须在PHP脚本的顶部写putenv('PATH=<your_shell_PATH_contents>');
。如果脚本本身使用它启动的二进制文件的相对路径,则单独使用shell脚本的完整路径将无济于事。