Jquery ajax等待PHP执行结束在其他页面


jquery ajax waiting end of php exec on other page

我有以下设置:按下按钮时调用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个请求每次我按下按钮。