【问题标题】:How do i get session without calling session_start我如何在不调用 session_start 的情况下获得会话
【发布时间】:2011-08-10 13:16:42
【问题描述】:

我现在有一个彗星页面,如果我在顶部调用session_start,那么会话会冻结,我的解决方法是:

function getTables($sessionID = null){

        if(!isset($this->output)){
            $this->output = array();
        }

        if(!isset($this->output[$this->sessID])){
            $this->output[$this->sessID] = array();
        }
        $hostname = php_uname("n");

        $sess_ini = session_save_path();
        chdir($sess_ini);
        if(false === ($save = @file_get_contents("sess_$this->sessID"))){
            $cwd = getcwd();
            chdir($this->location);
            return (isset($this->returnJSON[$this->sessID])?$this->returnJSON[$this->sessID]
                    :json_encode(array(
                        'sess_local'=>"$sess_ini/sess_$this->sessID",
                        'save'=>$save,
                        'hostname'=>$hostname,
                        'cwd'=>$cwd,
                        'reg_local'=>$this->location,
                        )
                    )
                );
        }
        chdir($this->location);
        //session_id($sessionID);
        $sessions = explode("|",$save);
        $_SESSION['all'] = array();
        foreach($sessions as $key=>$sess){
            if(trim($sess)=='all' && isset($sessions[$key+1])){
                $_SESSION['all'] = unserialize(trim(urldecode($sessions[$key+1])));
                break;
            }
        }
        ...

有没有更好的方法让我进入会话文件的会话变量?

【问题讨论】:

  • 我认为你需要解决并解决根本问题(为什么session_start() 会让事情冻结)
  • @James C 那是我的上一个问题......它通过从彗星无限帧中删除 session_start 来解决 -- stackoverflow.com/questions/5553830/…
  • @James,这是因为 php 存在两个具有相同 ID 的会话的限制

标签: php class session comet


【解决方案1】:

您的工作可以简单得多:

 <?php
 //yes, start normally.
 session_start();

 //now, immediately harvest the variables you need to remember from the $_SESSION
 $somevar_you_want_to_remember = $_SESSION['somevar'];

 //close the session, so it won't lock:
 session_write_close();

 //disable some errors which aren't really errors:
 ini_set('session.use_cookies',false);
 session_cache_limiter(false);

 //you are now free to do anything you like:
 while(true){

     echo "<script>window.parent.test_function('".time().' sessionvar: '.$somevar_you_want_to_remember."');</script>";

     flush_buffers();
     sleep(1);
     //if you need to refresh your variable, you can just reopen the session:
     session_start();
     $somevar_you_want_to_remember = $_SESSION['somevar'];
     //and immediately close again
     session_write_close();         
}

你可以写一些辅助函数,比如:

 function SaveQuickSessionVar($name,$value){
      session_start();
      $_SESSION[$name] = $value;
     session_write_close();     
 }

 function GetQuickSessionVar($name){
     session_start();
     $var = $_SESSION[$name];
     session_write_close(); 
     return $var;    
 }

【讨论】:

  • 这似乎有效 ^_^ 我从来不知道session_write_close
  • 我收到了这个警告:Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /var/www/html/live_mockup/comet/output.php:63) in /var/www/html/live_mockup/comet/output.php on line 56 但我想没关系?
  • 每一秒都应该没问题,虽然它会抱怨正在发送标头,但您可以放心地忽略它,因为它需要的原因(发送带有 id 的 cookie)已经成功。虽然,忽略警告可能不是 100%“干净”,但可以有充分的理由这样做,但我会看看是否能找到无警告的解决方案。
  • kk。现在我只是将error_reporting(0) 放在顶部以不显示警告,但非警告解决方案会很好
  • 确认,这里的测试表明ini_set('session.use_cookies',false);session_cache_limiter( FALSE ); 第一个session_write_close() 之后就可以了。
【解决方案2】:

PHP 的默认会话处理程序在脚本使用会话文件时将其锁定。 Comet 使处理程序脚本长时间处于活动状态,从而使会话保持锁定状态。你可以通过做来解决它

session_start();
session_write_close();

在您的 Comet 脚本中。它将使用存储的数据填充 $_SESSION,然后关闭会话文件并放弃对它的锁定。 $_SESSION 中的数据仍然存在且可用,您甚至可以更改它。唯一的区别是,除非您在脚本中执行后续的session_start(),否则这些更改不会写入磁盘上的会话文件。

因此,您可以在脚本中使用常规 PHP 会话,您只需要注意任何长时间运行的部分在该部分开始执行之前关闭会话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2018-07-03
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多