这个问题折腾了我四天的时间,每一天不断查阅资料,询问各路大佬,没有一个给出满意的答案,最后终于让我给整出来了。
我做的东西是首先点击一个PHP文件,然后PHP调用python文件,这个python的作用是点亮LED灯,搭载在树莓派上。
最开始的时候,我是用的PHP调用shell脚本,后来发现只有Python这句话不执行,就单独研究如何调用python。
首先我列一下失败的原因,有很多方面,下面我全面的总结一下:
以下原因挨个排查:
1.PHP调用python的函数有system,exec等,这个上网就可以查到,我用的是exec。首先新建一个php文件,内容如下:
<?php
phpinfo();
?>
之后进入这个PHP文件,按ctrl+f,搜索exec是否在disable_function里面,当我搜索的时候,发现exec被禁用了,因为这是一个高危函数。你把它删除之后就可以了。然后重启php,直接重启树莓派或者电脑也可以,更方便。
2.查看php是否是安全模式,在php.ini里面,safe_mode看看是都开着,开着的话可以换成off。寻找php.ini可以用以下命令:
find / -name php.ini 默认安装的话一般都在/etc/php5里面
3.在命令里面加入nohup。例如
<?php
exec("nohup python test.py");
?>
nohup具体的作用请百度。简单来说就是不断持续运行这条命令。
4.python使用绝对路径。上面的代码改成
<?php
exec("nohup /usr/bin/python /home/pi/Desktop/test.py")
?>
第一个参数用which python查找,一般默认都是我上面写的。第二参数是你要运行的python的路径。
5.将php文件与py文件放在同一个目录下面。
6.对于python赋予权限。你要执行那个py文件,就对哪个文件赋予权限
chmod 777 test.py
chmod u+x test.py
chown www-data test.py
这三条都可以。
写到这里一般的python都可以运行了,你如果想看反馈的信息可以这么写
<?php
$res = exec("nohup /usr/bin/python /home/pi/Desktop/test.py",$out1,$out2);
?>
输出的结果$out1是一个数组,存放的每一行运行的结果,第三个参数$out2如果是0,表示运行成功,如果是1,表示运行失败。
7.到这里时,我写了一单纯地输出字符串的python文件就可以正常运行了,但是我调用GPIO的控制LED的python却一直失败。这里的原因是你在运行的时候,需要sudo命令。但是PHP在运行的时候没有获得权限。所以最后的步骤是在语句上加上sudo
例如: exec("sudo nohup /usr/bin/python /home/pi/Desktop/test.py");就可以了。
下面我贴一个我写好的代码给大家看看:
python文件:led灯的接口是12阳极14阴极
light.py:
light.php:
按照我说的方法做之后,将两个文件放在同一目录下,点击light.php文件,led小灯就亮了!大功告成!
之后我问了群里的一些大神,其实控制LED完全可以调用PHP的GPIO库来实现,没有必要中间再加一个Python。这个日后我有时间研究了再发出来。
8.又重新做了一遍,发现exec执行的时候返回1,一直是错误,怎么也解决不了,在exec中加入exec("python python.py 2>error.txt 2&>1",$out1,$out2);
方便查看执行错误,以便查找错误。