我有以下设置:按下按钮时调用ajax函数,该函数从另一个运行python脚本的页面执行php脚本。首先,如果你认为有更好的方法,我准备听到它,但这是我设法做到这一点的唯一方法。我的问题是我无法从jquery和php中获取ajax以便彼此交谈以便我可以得到反馈。
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命令完成并发送结果,以便它可以在警报中写入它。
如果您对此有任何想法,感谢您的帮助。
答案 0 :(得分:0)
这可以帮助您作为exec命令的文档:
http://php.net/manual/en/function.exec.php
注意:如果程序是使用此功能启动的,则为了它 继续在后台运行,程序的输出必须是 重定向到文件或其他输出流。没有这样做会 导致PHP挂起,直到程序执行结束。
通过将-o传递给你的python脚本,你很可能将输出重定向到文件而不是标准输出...因此,exec看到立即返回并认为程序已完成,或正在后台运行..
因此,php脚本不会等待你的相机脚本完成并且在文件可以完全输出之前返回...
你可以在调用php中的exec之后抛出一个等待循环来检查文件是否已完成输出,或者观察pid不再作为“ps”shell命令的输出而存在。
同样,问题是(很可能)输出正从stdout重定向,并且exec正在返回,认为该进程已被置于后台运行模式...
答案 1 :(得分:0)
好的,我发现了问题。
我已经更换并使用了
$(document).ready(function(){
$("#btnpicture").click(function() {
相反,现在工作正常。我认为我以前的代码每次按下按钮都会发送2个请求。