【问题标题】:Storing progress in session variable在会话变量中存储进度
【发布时间】:2014-04-19 12:48:20
【问题描述】:

当用户在我的网络应用程序(php/js/html)中执行查找请求时,我正在尝试实现一个进度条。

当用户执行查找请求时,应用程序使用 ajax 执行 php 脚本,该脚本定期将其进度存储在 session 变量中。

我试图做的是用另一个 ajax 请求轮询服务器以请求会话进度变量,但该变量不存在。

为什么会发生这种情况,使用 php 会话是不可能的吗?

谢谢

JS 逻辑:

// When the user selects interested object, find it on the server
$(document).on('change', '#findStreamer', function()
{
   $streamerId = $(this).val();
   $streamerName = $('#findStreamer option[value="'+$streamerId+'"]').text();
   console.log('findDB', $streamerId, $streamerName);
   addProgressBar();
   getProgress();

    $.ajax({
            type: 'POST',  
            url: 'serverlink/findobject', 
            data: { 
                      findChannel: $streamerName,
                      checkOnline: true
                  },
            success: function(response) 
            {
                $streamData = JSON.parse(response);
                $('#streamPreview').remove();
               // $('#findPanelToolbar').before($streamData.streamerView);
                console.log($streamData);

            }

    });


});




 function getProgress()  
{
$.ajax({  
       type: 'POST',  
       url: 'serverlink/getprogress', 
       complete: getProgress,
       timeout: 60000,
       success: function(response) 
              {
                  $progresValue = response;
                  updateProgressBar($progresValue);

              }
         });
}

服务器逻辑:

    public function action_findobject()
        {
            $_SESSION['percentage'] = 0;

            if(!(Input::is_ajax()))
            {
                $response = Response::forge();
                $response->set_status(400);
                return $response;
            }


// Long actions //

            $_SESSION['percentage'] = 10;


// Long actions //            

           $_SESSION['percentage'] = 45;


// Long actions //           


            $_SESSION['percentage'] = 100;

            return $Outputdata;



        }


public function action_getprogress()
{
    return $_SESSION['percentage'];


}

【问题讨论】:

  • 请贴出相关代码
  • 你还记得session_start(); 吗?
  • 是的,在写入和读取变量时设置了会话开始,我使用的是 php 框架,为了清楚起见,我将代码更改为普通 php。如果在会话中找不到变量,getprogress 函数总是返回默认值。

标签: javascript php jquery ajax session


【解决方案1】:

我认为你需要创建 php 脚本,它会执行大部分进程并发送带有 %.json 的 json。百分比也需要存储在会话中。在浏览器中,您将调用 ajax 直到出现错误或 100% 结果。从服务器得到答复后,如果 percents 向客户显示新的百分比行并对服务器执行相同的请求..

【讨论】:

    【解决方案2】:

    不是一个解决方案,所以我将对此进行 wikify,但要回答这个问题,“这不可能使用 php 会话吗?”... 看起来像不 - 或者至少不在代码中目前的形式。您必须以某种方式将资源密集型操作委托给另一个进程,因为以下简单测试表明第一个操作是阻塞

    <?php // sleep.php
        session_start();
        $_SESSION['foo'] = gmdate('r');
        sleep(10);
    
    <?php // test.php
        session_start();
        echo !isset($_SESSION['foo'])
            ? 'session not set'
            : $_SESSION['foo'];
    

    测试:

    浏览 /sleep.php 在会话中设置一些值,然后等待 10 秒(任意)以模仿一些详尽的程序/执行。在 10 秒延迟内打开一个新选项卡并浏览 /test.php

    预期结果:

    /test.php 立即返回由 /sleep.php

    设置的日期

    实际结果:

    /test.php 请求挂起/等待,直到 /sleep.php 请求完成。

    【讨论】:

      【解决方案3】:

      我设法在文件中使用缓存解决了这个问题,不知道这有多优化,但感谢大家的建议!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多