显示PHP _during_ AJAX请求的响应

时间:2014-03-08 13:57:11

标签: php jquery ajax

目前我正在开发一些应用程序,我在其上执行一个触发PHP脚本的AJAX请求。这个脚本回显并在执行时返回一些东西。 现在能够在触发.success()之前在前端显示它会很好。这是可能的,如果是这样的话;如何?

干杯!

更新了一些代码

Ajax +提交(js)

$('document').ready(function() {
    setAlbum.getForm.submit( function( e ) {
        setAlbum.albumSubmit( e );
        return false;
    });
});

var setAlbum = {
    getForm             : $('#albumForm'),

    createUrlList       : function() {
        var rawUrlList = setAlbum.getForm.find('#AlbumUrlList').val();
        var urlList = rawUrlList.split(/\r?\n/g);

        return urlList;
    },

    albumSet            : function() {
        var set = {
            albumName           : setAlbum.getForm.find('#AlbumName').val(),
            albumDescription    : setAlbum.getForm.find('#AlbumDescription').val(),
            albumUrlList        : setAlbum.createUrlList(),
        };
        return set;
    },

    albumSubmit     : function( e ) {
        e.preventDefault();
        console.log( setAlbum.albumSet() );

        $.ajax({
            type: 'POST',
            url: "query.php",
            data:  setAlbum.albumSet(),
            success: function(data) {
                console.log(data)
            }  
        });
    }
};

query.php(部分)

$naming = $_POST['albumName'];
$albumDescription = ['albumDescription'];
$photolist = $_POST['albumUrlList'];

$albumset = [
        'AlbumName' => $naming,
        'ItemList' => $photolist,
        'AlbumDescription' => $albumDescription
];

/** GET FILESIZE CURL **/
function getFileSize( $url ) {
    $headers = get_headers($url);
    $fileSize = -1;
    echo var_dump($headers);
    echo $url;
    foreach( $headers as $h ) {
        preg_match( '/Content-Length: (\d+)/', $h, $m );
        if ( isset($m[1]) ) {
            $fileSize = (int)$m[1];
            break;
        }
    }

    $formattedFileSize = formatSizeUnits( $fileSize );
    echo 'Filesize:: ' . $formattedFileSize;

    return $fileSize;
}

//* FILESIZE FORMATTER *//
function formatSizeUnits( $bytes ) {
    if ($bytes >= 1073741824) {
        $bytes = number_format($bytes / 1073741824, 2) . ' GB';     
    } elseif ($bytes >= 1048576) {
        $bytes = number_format($bytes / 1048576, 2) . ' MB';
    } elseif ($bytes >= 1024) {
        $bytes = number_format($bytes / 1024, 2) . ' KB';
    } elseif ($bytes > 1) {
        $bytes = $bytes . ' bytes';
    } elseif ($bytes == 1) {
        $bytes = $bytes . ' byte';
    } else {
        $bytes = '0 bytes';
    }
    return $bytes;
}

function getPhotosSize( $array, $maxSize ) {
    $photos = $array['ItemList'];

    $countTotal = sizeof($photos);

    $count = 1;
    foreach( $photos as $photo ) {
        echo '<h2>Checking filesize&hellip;</h2>';

        //  saveImage( $img, $fullpath )
        $url = $photo;
        $photocount = sprintf('%02u', $count);

        getFilesize($url);
    }
}

getPhotosSize($albumset, $maxFileSize);

4 个答案:

答案 0 :(得分:1)

因此,基本上您希望在执行脚本时进行实时日志监控。你可以在ajax中执行此操作,但它将是一系列的ajax调用。

  1. 调用Ajax来触发脚本。
  2. 检查脚本状态的间隔Ajax调用。此呼叫将由#1。
  3. 触发
  4. 你必须有一个停止#2的标志/响应。让我们说在你的PHP脚本中你将添加数组(“process”=&gt;“完成”)。那么这将是javascript中用来终止间隔调用的标志。
  5. 在PHP脚本方面,您可能需要有一个记录器文本,用于显示该执行所需的消息。因此,不是“回显”这些消息,而是将其保存在临时文本文件中,然后将其解析并返回到客户端(ajax调用中的#2)。

    另一种方法是通过套接字。请参阅http://socket.io/。这是更清洁的方法(我推荐)。每个客户端(js端)都可以连接到套接字连接,在你的php端,你只需要在该套接字连接中发布一个文本,就是这样!你有点模仿聊天服务器 - 客户端方法。

答案 1 :(得分:1)

是的,这是可能的。流程如下:

  • 向服务器发送一些请求(启动作业)
  • 服务器启动后台处理并更新过程数据的数据库(处理时)
  • 以一定的间隔向服务器发出ajax调用 - &gt;服务器从数据库中读取流程数据并将其返回到浏览器

我做到了这一点。例如,在Drupal中有一个名为“后台进程”的模块。

答案 2 :(得分:0)

是的,您必须使用AJAX请求中的函数(数据)捕获返回的值。

答案 3 :(得分:0)

已编辑:我之前的代码不相关,因为我不知道在哪里触发了()。我现在已经更新了。

<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">
</script>
<script>
$(document).ready(function(){

      var flag = false; //means no ajax request. true means ajax request processing.

      function send_request() {

          flag = true;
          $.ajax({
              url: "http://localhost/test.html",
                //async: true,
                success: function(data) {

                    flag = false;
                    output = data;
                    alert(data);
                }
          });

      }

      setTimeInterval('startProcess()', 1000);

      function startProcess() {


            if(flag) {                  
                //request is being processed.           
            }else{

                //request ended. stop the timer

            }

      }
});
</script>
</head>
<body>
<div id="container"></div>

</body>
</html>