我使用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));