为什么$ ajax状态在请求后挂起(jquery / php)

时间:2018-06-06 12:23:05

标签: php jquery ajax

我使用ajax请求使用jquery和php在服务器上启动进程。

目的是开始处理文件,将其插入数据库并跟踪进度。

我不明白为什么启动请求状态正在等待并在之后解决 一会儿(3s或更多)。

我认为请求是异步的,但似乎没有。 我还在php脚本中添加了两个标题关闭连接(因为 看起来ajax请求正在等待某种类型的返回)并在向服务器发送响应后进行任务。

我的环境是Windows 7 x64,xampp下的PHP 5.6,启用了gzip和Jquery 1.7.2

代码有效,但不符合预期。

我如何解决这个问题? 感谢。

用于发出请求的javascript代码,并跟踪进度

$(document).ready(function()
{

// Request code
var formdata = $("#form").serialize();
$.ajax({
      url:"../module/upload.php",
      async:true,
      type:'post',
      data:formdata
})
.done(enable_upload_tracking)
.fail(upload_error);

// Enable timer to track progress
function enable_upload_tracking() {
timer = window.setInterval(timer_callback,1000);}

// 
function timer_callback()
{

    var data = {
        file:$("#selectedfile").val()
    };

    $.ajax({
        url:"../module/progress_track.php",
        type:'post',    
        data:data
    })      
    .done(render_progress)
    .fail(timer_error); 
}

function render_progress(params)
{
    if ( params.percent == 100 )
    {
        // clear the timer. Upload complete
        window.clearInterval(timer)

        // restores gui state               
        restore_gui();
    }
    else
    {
        $("#progressbar").css("width",params.percent + '%');
        $("#progress_text").html(params.message);
    }
}

function upload_error(ajx,status,err)
{   
    window.clearInterval(timer);
    restore_gui();
    alert(err)
}

function timer_error()
{
    window.clearInterval(timer);
    restore_gui();
}

function restore_gui()
{ 
   $("#box_upload").addClass("invisible");
   $("#progressbar").css("width",'1%'); 
}

});

php代码

upload.php的

<?php

// some basic param validation
$file = filter_input(INPUT_POST,'file_brands',FILTER_SANITIZE_STRING);
if ( $file === false || is_null($file) ) die();

// needed lib
// It processes the CSV file
require_once('/classes/UploadController.php'); 


$controller = new UploadController();

// set the file what is being processed
$controller->SetFile('../imports/'.$file);

// csv file columns format
$format = array(
            'numcols' => 1,
            'columns' => array(
                                0 => 'Marca'
                        )
);

// CSV column format validation
if ( $controller->IsValidFormat($format) )
{   

    // All is ok, so I close connection
    header("Connection: close");
    header("Content-Length: 0");

    // start file processing
    // may be a heavy process, so I set time limit to zero
    // ProcessCsv function writes in a file the progress of the task
    // json encoded.
    set_time_limit(0);
    $controller->ProcessCsv($file);
}
else // The file format does not match
{   
   header('HTTP/1.1 500 Internal server error');
   die();
}

progress_track.php

<?php
// Just read the progress file requested and return it
// Some validation
$targetfile = filter_input(INPUT_POST,'file',FILTER_SANITIZE_STRING);
if ( $targetfile === false || is_null($targetfile) ) die();

$file = 'tracking.'.$targetfile.'.upload';

header('Content-Type: application/json');

if (file_exists($file))
 { 
  $text = file_get_contents($file);
  echo $text;

  $obj = json_decode($text);  
  if ($obj->percent == 100) {unlink($file);}  
}
else 
  echo json_encode(array("percent" => null, "message" => null));

0 个答案:

没有答案