jquery ajax在其他页面上等待php exec的结尾

时间:2015-05-19 19:58:27

标签: php jquery ajax

我有以下设置:按下按钮时调用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命令完成并发送结果,以便它可以在警报中写入它。

如果您对此有任何想法,感谢您的帮助。

2 个答案:

答案 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个请求。