在控制器中通过命令行执行Python - PHP/CodeIgniter
在我的 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
有人能帮我解决这个问题吗?
5 个回答
0
系统只返回最后一行的内容。
system 是一个用来执行命令的函数。
public function deploy_test() {
system("python --version", $out);
echo json_encode(implode($out));
}
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"
正如预期的那样。
4
问题不在你的代码或PHP上。
问题出在你的权限设置上。
PHP使用的是在Apache环境变量中设置的权限。
理想情况下,这些权限应该设置为:
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
在你的apache2或httpd配置文件中。
举个例子:
试着运行:
<?= `whoami` ?>
通过你的命令行和浏览器来测试。
你的浏览器可能会显示为www-data,而命令行会显示你的用户名,或者如果你在AWS上,可能会显示为default,甚至可能是root
。
你不需要使用system()
,可以用exec()
来代替。
我们应该接近这样的设置:
echo json_encode(exec("python --version"));
执行操作时,你需要确保用户和组的设置是正确的。
可以查一下这个链接: 在命令行中,“2>&1”是什么意思?
所以你的代码应该是:
echo json_encode(exec("python --version 2>&1"));
希望这对你有帮助!