php - 在挂起的PHP页面的背景中,python 运行进程

  显示原文与译文双语对照的内容
86 1

我有一个PHP页面启动 python 脚本,但PHP页面挂起,直到脚本完成。是否有办法运行不会挂起的脚本?

PHP代码

问题发生在 alarm_on 。所有其他情况都正常。

<?php
session_start();
if(isset($_COOKIE['userME']))
 echo"Hello,".$_COOKIE['userME'].'<br>';
if(isset($_SESSION['UserData']['Username']) || $passed )//or $logins[$Username] == $Password)
{
if (isset($_POST['submit'])) {
 switch ($_POST['submit']) {
 case 'room_light':
 echo shell_exec("sudo python/home/pi/Desktop/PiControl/room_light.py");
 break;
 case 'alarm_on':
 echo"alarm started";
 shell_exec("nohup sudo python/home/pi/Desktop/PiControl/motion_sensor.py &");
 echo"alarm on";
 break;
 case 'alarm_off':
 echo"alarm off"; 
 echo shell_exec("sudo pkill -f motion_sensor.py");
 break;
}
}
?>
<form method="post">
<input type="submit" name="submit" value="room_light">
<input type="submit" name="submit" value="alarm_on">
<input type="submit" name="submit" value="alarm_off">
</form>
<?php
}
else
{
 header("location:login.php");
}
?>

motion_sensor.py

import sys
import urllib2, urllib
import RPi.GPIO as GPIO
#setup GPIO using Board numbering. pin physical number corresponds to gpio call
GPIO.setmode(GPIO.BOARD)
pin=37
url="http://MY_IP/test.php"
GPIO.setup(pin, GPIO.IN)
def alarmChange(channel):
 if(GPIO.input(pin)):
 print 'Sensor tripped',channel
 postdata={'sensor_tripped': channel}
 postdata=urllib.urlencode(postdata)
 req=urllib2.Request(url, postdata)
 req.add_header("Content-type","application/x-www-form-urlencoded")
 page=urllib2.urlopen(req).read()
 #print page
 else:
 print 'sensor no longer tripped', channel
GPIO.add_event_detect(pin, GPIO.BOTH, callback=alarmChange)
print"alarm on"
while True: #this is a hack to keep the script running all the time so it will continue event detection
 i=0
GPIO.cleanup() #should never hit this point
时间:原作者:0个回答

...