我有以下设置:按下按钮时调用ajax函数,该函数从另一个页面执行php脚本,该脚本将运行python脚本。首先,如果你认为有更好的方法,我愿意听一听,但这是我唯一的方法。我的问题是我不能得到ajax从jquery和php互相交谈,这样我就可以得到反馈。
index.php只有一个按钮,调用一个id设置为#btnpicture的函数。
ajax脚本如下:
// JavaScript Document
$(document).on('pageinit', '', function(){
$(document).on('click', '#btnpicture', function() {
$.ajax({url: 'actions.php',
data: {action : 'takepicture'},
type: 'post',
async: 'true',
dataType: 'json',
beforeSend: function() {
// This callback function will trigger before data is sent
$.mobile.loading("show") // This will show ajax spinner
},
complete: function() {
// This callback function will trigger on data sent/received complete
$.mobile.loading("hide") // This will hide ajax spinner
},
success: function (result) {
if(result.status) {
alert(status);
} else {
alert('Something went wrong taking the picture!');
}
},
error: function (request,error) {
// This callback function will trigger on unsuccessful action
alert('Network error has occurred please try again!');
}
});
});
我知道应该有一个结束});但是这个脚本相当长,我只在这里展示使用的内容。这是有效的,但只是我没有得到我想要的。
页面actions.php为:
<?php
require_once ("Config/Lite.php");
if(isset($_POST['action'])) {
switch ($_POST['action']) {
case "takepicture":
$output = shell_exec("sudo rm /var/www/photo/*");
exec("sudo python /home/pi/compteur/compteur.py -o /var/www/photo/photo -f", $output, $error);
$status = end($output);
$result = array('status' => $status);
echo json_encode($result);
break;
这里也是,通常有更多的行,但这里没有写。
所以脚本正在工作,图片正在拍摄,但问题是,一切似乎不同步。ajax脚本没有等待exec命令完成并发送结果,因此它可以将其写入警报。
谢谢你的帮助,如果你有任何想法。
这可以帮助您从exec命令中获取文档:
http://php.net/manual/en/function.exec.php注意:如果一个程序是用这个函数启动的,为了使它在后台继续运行,程序的输出必须为重定向到文件或另一个输出流。如果不这样做,将会导致PHP挂起,直到程序执行结束。
通过将-o传递给python脚本,您可能会将输出重定向到文件而不是标准输出…因此,exec看到立即返回并认为程序已经完成,或者正在后台运行…
因此,php脚本不会等待您的相机脚本完成,而是在文件可以完全输出之前返回…
您可以在PHP中调用exec之后抛出一个等待循环,以检查文件是否已经完成输出,或者观察pid是否不再作为"ps"shell命令的输出存在。
同样,问题是(可能)输出是从stdout重定向的,exec返回时认为进程已置于后台运行模式…
好了,我找到问题了。
我已经替换并使用了
$(document).ready(function(){
$("#btnpicture").click(function() {
,它现在工作得很好。我认为我以前的代码是发送2个请求每次我按下按钮。