2013-07-16 60 views
0
session_start(); 

    if(isset($_GET['progress'])){ 
     $status_done = '0'; 

     if($_SESSION['progress_percentage'] == "100"){ 
      $status_done = '1'; 
     } 

     echo json_encode(array(
      'progress_percentage' => $_SESSION['progress_percentage'], 
      'progress_status' => $_SESSION['progress_status'], 
      'progress_done' => $status_done 
      ) 
     ); 
    } 
    elseif(isset($_GET['dummytask'])){ 
     for ($i = 1; $i <= 100; $i++) { 
      $_SESSION['progress_percentage'] = $i; 
      $_SESSION['progress_status'] = 'Checking the locks and stuffing the dolls!'; 
      sleep(1); 
     } 
    } 
 $(document).ready(function(){ 
      var timeout = ''; 

      function checkProgress(){ 
       console.log('Checking progress event started'); 

       $.ajax({ 
        url: 'http://willetu54.fiftyfour.axc.nl/dgi/ajax.php?progress&time='+ new Date().getTime(), 
        cache: false, 
        dataType: 'json' 
       }).done(function(data) { 
        $('#progressbar-progress').html(data.progress_status +'('+ data.progress_percentage +')'); 

        console.log('Progress checked'); 
        console.log(data); 

        if(data.progress_done == "1"){ 
         clearTimeout(timeout); 
        } 
       }).fail(function(jqXHR, status, error){ 
        console.log('Check Progress: Error: '+ error + status +''); 
       }); 

      } 

      function checkProgressTimeout(){ 
       checkProgress(); 
       console.log('Timeout tick for progress'); 

       timeout = setTimeout(checkProgressTimeout, 500); 
      } 

      $('#menu-open').click(function(event){ 
       checkProgressTimeout(); 

       console.log('starting dummy task'); 

       event.preventDefault(); 

       $.get('http://willetu54.fiftyfour.axc.nl/dgi/ajax.php?dummytask', function(data) { 
        alert('Load was performed.'); 
       }); 
      }); 
     }); 

您好再次#1!检查PHP脚本的进步与AJAX

我目前正在开发的系统的脚本运行速度很慢,有时可能会持续20秒。 (创建大量文件夹,移动大量文件等)。这就是为什么我设计了这个脚本。我创建了一个只需要持续〜100秒的小型dummytask。当我使用AJAX触发该脚本时,它完成了一定数量的任务。每当任务完成时,我用脚本的进度更新我的$_SESSION变量,并用另一个jQuery脚本将它加载到我的页面上。

但它有点奇怪。我认为它确实启动了checkProgressTimeout和虚拟任务(使用checkProgressTimeout函数每500毫秒检查一次进度),但是当我查看控制台时,我发现它只触发事件但没有得到任何结果,直到虚拟任务完成然后它用相同的timeval(500ms)慢速返回进度检查。

Google Chrome中会出现此问题。该脚本在IE中完全不起作用。

我建立了一个jsFiddle:http://jsfiddle.net/nZAs4/2/。但由于jsFiddle不支持PHP脚本,我已经有权将其自己上传到我自己的虚拟主机之一。 (我也允许访问控制允许来源)。

那么我该如何得到这个工作?

+0

'$ status_done = '0';'所以你添加字符串'0'这是毫无整数! 'String + String = StringString'。 'parseInt(StringString)= NaN(不是数字)' –

+1

您的会话数据只有在脚本完成时才可用。你应该考虑更新数据库,并关闭会话进行写入以允许另一个脚本同时运行'session_write_close()'http://php.net/manual/en/function.session-write-close.php – Waygood

+0

@Bondye Can你解释一下吗?我没有跟着。 – Thew

回答

1

由于N3rd决定复制和粘贴这里是我的:

默认情况下,您的会话变量不访问其他脚本,直到当前脚本终止。在完成处理会话数据以保留数据后,您必须调用session_write_close()

这可以如下进行:

  1. 启动会话
  2. 创建此行书
  3. 更新您的会话记录本记录的索引数据库的条目
  4. 关闭会话书写session_write_close();
    • 这可以让您的监控脚本开始工作
  5. 运行脚本(这需要年龄) 的处理部分,同时更新其进度

的监控脚本数据库条目:

  1. 启动会话(这将挂起,直到在另一个脚本中同一会话结束/写关闭)
  2. 检查会话为索引的工作
  3. 从数据库中获取数据
  4. 进度显示
  5. 关闭会话
+0

但是使用数据库,不会为脚本添加几百毫秒的时间吗? – Thew

+1

取决于你更新/检查它的频率。由于这是我在10分钟+脚本上使用的方法,几毫秒可以忽略不计 – Waygood

+0

好吧,正如我所说的脚本将持续20秒,有时甚至更长。 – Thew

1

默认情况下,直到脚本终止,您的会话变量才会更新。您必须致电session_write_close()才能保存数据。

+0

我在哪里放置'session_write_close()'?我是否必须将它放在session_start()之下,还是在更新会话之前或之后使用它?关于PHP.net的文档不会告诉我这个... – Thew

+0

每当您将数据写入会话并希望该数据可用于其他脚本时。不过,您可能必须重新打开会话才能再次关闭会话。 – n3rd