如何使用jQuery同时加载两个PHP脚本?

时间:2015-06-23 15:17:34

标签: php jquery ajax

我有一个由各种不同阶段组成的上传功能,上传的持续时间可能非常长。为了提高此功能的可用性,我想向用户提供有关上传进度的信息。

上传是通过jQuery处理的,并使用AJAX与数据库进行通信。

要呈现不同的消息,我将在上传脚本的不同阶段更改会话变量(status)的值。我正在尝试使用setInterval检查每一秒status的值,但这不会显示任何内容,也不会导致上传代码无效。

jQuery的:

$('.content form').on('submit', function(e) {
  e.preventDefault();

  //get session value every second
  setInterval(function() {
    $.ajax({
        url: "index.php?route=module/stock/getStatus&token=<?php echo $_GET['token']; ?>",
        success:function(response){
          console.log(response);
        }
    });
  }, 1000);

  //process upload
  $.ajax({
    url: $(this).attr('action'),
    type: "POST",
    data: form_data,
    cache: false,
    processData: false,
    contentType: false,
    success: function(data) {
      data = $.parseJSON(data);
    }
  });
});

PHP用于检索会话值(第一个AJAX请求):

echo json_encode($_SESSION['status']);

用于上传的PHP(第二个AJAX请求):

$get = $this->pdf2string($name); //get pdf data
$text = str_replace("\n", ",", $get); //change all new lines to commas

// process replacement strings

$replacements = array(
    'Item No.' => 'sku',
    'Description' => 'description,stock,discontinued',
);
$_SESSION['status'] = array(
    'info' => 'Converting file to CSV'
);

foreach($replacements as $search => $replace) {
    $text = str_replace($search, $replace, $text);
}

$_SESSION['status'] = array(
    'info' => 'Structuring CSV data'
);

foreach($array as $item) {
    // process csv data
}

$_SESSION['status'] = array(
    'info' => 'CSV Structured'
);
$this->storeData($new_array); //store data

如何同时使用两个AJAX请求?

我在XAMPP上使用Windows 8.1,但是我有一个测试服务器仍然会产生上面讨论的相同结果。

任何帮助都会很棒!

3 个答案:

答案 0 :(得分:1)

要记住以下几点:

  • 您的浏览器将限制同时发出的请求数。这取决于浏览器,可以是2到8之间的任何地方。

  • 服务器可能在等待资源(被另一个请求锁定)时锁定请求。如果您正在使用会话,请确保尽快关闭会话,或者同时请求等待

  • 您可能希望查看推送通知(而不是拉取)来获取进度数据。您可以使用websockets或eventsource。

答案 1 :(得分:1)

听起来您的计算机没有处理多个连接。我在superuser.stackexchange上发现了类似的问题 - XAMPP apache not handling multiple requests

他的解决方案是:

  

每次要写入时都会启动和停止会话   会议有效。

如果没有他提供任何代码,我怀疑他做了类似的事情:

session_start();
$_SESSION['status'] = array('info'=>'msg goes here');
session_write_close();
//...
session_start();
$_SESSION['status'] = array('info'=>'another msg goes here');
session_write_close();
//...

答案 2 :(得分:1)

好吧,我认为setInterval有点乱,因为即使先前的代码处于i / o等待或网络延迟,它也会在定时间隔内执行。 第二件事是你必须在预定的任务完成后释放它。

所以我稍微修改了你的代码,

var status_fun=function() {
    $.ajax({
        url: "index.php?route=module/stock/getStatus&token=<?php echo $_GET['token']; ?>",
        success:function(response){
          console.log(response);
          /////////////////////////////////////////////////////////
          //Add Something to quit this timed loop after completion
          //And please do handle ajax error case too
          setTimeout(status_fun,1000);
          /////////////////////////////////////////////////////////
        }
    });
  };






$('.content form').on('submit', function(e) {
  e.preventDefault();


  status_fun();

  $.ajax({
    url: $(this).attr('action'),
    type: "POST",
    data: form_data,
    cache: false,
    processData: false,
    contentType: false,
    success: function(data) {
      data = $.parseJSON(data);
    }
  });




});

希望它有所帮助,因为我不确定你的目标。