在我的automation.php
控制器中,我有以下功能:
public function deploy_test() {
echo json_encode(system("python --version"));
}
当用户想要部署测试时,通过单击网页中的test
按钮,他将能够完成这样的任务。然而,当我点击test
按钮时,我的输出是:
""
同时,当我用命令
执行相同的函数时:public function deploy_test() {
echo json_encode(system("ls -l"));
}
我:
total 32
drwxr-xr-x. 15 philippe philippe 4096 Mar 4 16:48 application
drwxrwxr-x. 2 philippe philippe 4096 Mar 4 17:28 css
-rw-r--r--. 1 philippe philippe 6357 Jan 30 11:53 index.php
drwxrwxr-x. 2 philippe philippe 4096 Feb 27 15:38 js
-rw-r--r--. 1 philippe philippe 2496 Jan 30 11:53 license.txt
drwxr-xr-x. 8 philippe philippe 4096 Jan 30 11:53 system
drwxr-xr-x. 12 philippe philippe 4096 Jan 30 11:53 user_guide
谁能帮我弄清楚吗? 问题是不是与您的代码或PHP。
问题出在你的权限上。
php使用的权限是在apache的env-vars中设置的。
理想设置为:
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
在apache2/HTTPD配置文件下。
例如:尝试运行:
<?= `whoami` ?>
通过你的shell和浏览器。
你的浏览器可能会显示www-data, shell会显示你的用户名,或者如果你使用AWS,默认会显示root
你不必用system()
,用exec()
代替。
我们应该接近:
echo json_encode(exec("python --version"));
执行操作需要设置正确的User和Groups。
查找:In the shell, what does "2祝辞,1";的意思吗?
所以你的代码应该是:echo json_encode(exec("python --version 2>&1"));
希望有帮助!
这在我的生产服务器上运行良好
public function deploy_test() {
echo json_encode(system("python --version 2>&1"));
}
输出
Python 2.7.3
"Python 2.7.3"
unix命令的输出打印两次,作为system()本身将结果输出给浏览器。因此,可以使用exec()代替system来避免这种情况。
public function deploy_test() {
echo json_encode(exec("python --version 2>&1"));
}
输出"Python 2.7.3"
。
我怀疑它不在路径中。试一试:
输入python命令的完整路径(如/usr/bin/python --version
)
-
使用which, 'which python'命令查找
-
尝试从命令行执行您的脚本,'php script.php' =>有时web
-
确保错误显示已启用
报错(' display_errors ', 1);
系统只返回最后一行。系统
public function deploy_test() {
system("python --version", $out);
echo json_encode(implode($out));
}
这有点黑,但是即使你不允许执行python(这是'user' CI的情况),你也可以用1十进制找到版本号。
//find python path
exec("which python", $path);
//show all subdirs in python
exec("ls -l ".$path[0]."*", $output);
$output = implode("'n", $output);
//preg match on version numbers
preg_match_all("#python('d+(?:'.'d{1,2})?)#", $output , $matches);
$installed_versions = $matches[1];
//sort in reversing order
$versions_sorted_desc = array_reverse($installed_versions);
//latest version is element 0
$latest_version = $versions_sorted_desc[0];
echo $latest_version;