2011-04-21 34 views
2

我现在有一个彗星页,如果我打电话session_start顶部则会话冻结,我的工作围绕做的是这样的:我怎么会不调用在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; 
      } 
     } 
     ... 

有一个更好的方式让我变得会话变化多数民众赞成进入会议文件?

+2

我认为你需要解决和解决根本问题(为什么'session_start()'让事情冻结)而不是 – 2011-04-21 19:19:18

+0

@詹姆斯C这是我的prev问题....它解决了从session_start彗星的无限帧 - http://stackoverflow.com/questions/5553830/how-do-irefresh-the-session-in-comet – Neal 2011-04-21 19:21:34

+0

@詹姆斯,这是由于事实,有限制在PHP与有两个会话目前有相同的ID – Neal 2011-04-21 19:28:01

回答

3

你的工作,各地可以简单得多:

<?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;  
} 
+0

这似乎是工作^ _ ^我从来不知道'session_write_close' – Neal 2011-04-21 19:38:51

+0

我收到此警告:警告:session_start()[function.session-start]:无法发送会话cookie - (在/var/www/html/live_mockup/comet/output.php:63开始输出)在第56行的/var/www/html/live_mockup/comet/output.php中发送的头文件,但我想它没有物? – Neal 2011-04-21 19:41:46

+0

每一秒都应该没有问题,虽然它抱怨发送的头文件,但您可以放心地忽略它,因为它需要的原因(发送带ID的cookie)已经成功。尽管忽略警告可能不是100%“干净”,但可以有充分的理由完成,但我会看看我是否能找到一个无警告的解决方案。 – Wrikken 2011-04-21 19:42:11

3

PHP的默认会话处理程序锁定了会议文件,而这是在使用一个脚本。彗星会使处理程序脚本长时间保持活动状态,从而保持会话锁定。你可以通过做你的彗星脚本

session_start(); 
session_write_close(); 

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

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

+0

soo关闭@marc。谢谢^ _ ^ – Neal 2011-04-21 19:40:03