2011-04-21 74 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