在我的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
有人可以帮我解决问题吗?
答案 0 :(得分:4)
您的代码或PHP的问题不。
问题在于您的权限。
php使用在apache的env-vars中设置的权限。
理想情况下设置为:
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
在你的apache2 / httpd conf文件下。
例如:
尝试跑步:
<?= `whoami` ?>
通过您的shell和浏览器。
您的浏览器可能会说www-data和shell会说出您的用户名,或者如果您在AWS上 - 默认情况下,您会得到root
您不必使用system()
,而是使用exec()
。
我们应该接近:
echo json_encode(exec("python --version"));
执行操作将要求您设置正确的用户和组。
查找:In the shell, what does " 2>&1 " mean?
所以你的代码应该是:
echo json_encode(exec("python --version 2>&1"));
希望它有所帮助!
答案 1 :(得分:1)
这适用于我的生产服务器
public function deploy_test() {
echo json_encode(system("python --version 2>&1"));
}
输出
Python 2.7.3
"Python 2.7.3"
unix命令的输出打印两次,因为system()本身将结果输出到浏览器。所以exec()可以用在系统的位置来避免这种情况。
public function deploy_test() {
echo json_encode(exec("python --version 2>&1"));
}
输出
"Python 2.7.3"
正如所料。
答案 2 :(得分:0)
我怀疑它不在路上。尝试:
键入python命令的完整路径(例如/usr/bin/python --version
)
使用'which python'
尝试从命令行执行脚本'php script.php'=&gt;有时候网络 服务器设置不同的东西
确保使用
启用错误显示的ini_set( '的display_errors',1);
答案 3 :(得分:0)
系统仅返回最后一行。 system
public function deploy_test() {
system("python --version", $out);
echo json_encode(implode($out));
}
答案 4 :(得分:0)
这有点破解,但是你可以找到带有1位小数的版本号,即使你不允许执行python(“用户”CI就是这种情况)。
//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;