簡體   English   中英

我如何在不調用session_start的情況下獲得會話

[英]How do i get session without calling 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;
            }
        }
        ...

對於我來說,有沒有一種更好的方法可以使會話變量進入會話文件?

您的解決方法可以更簡單:

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

PHP的默認會話處理程序在腳本使用會話文件時將其鎖定。 Comet使處理程序腳本長時間處於活動狀態,從而使會話保持鎖定狀態。 您可以通過以下方法解決它

session_start();
session_write_close();

在您的Comet腳本中。 它將用存儲的數據填充$ _SESSION,然后關閉會話文件並放棄對其的鎖定。 $ _SESSION中的數據仍然存在並可用,您甚至可以更改它。 唯一的區別是,除非您在腳本中執行后續的session_start() ,否則這些更改將不會寫出到磁盤會話文件中。

因此,您可以在腳本中使用常規的PHP會話,您只需要確保所有長時間運行的部分在該部分開始執行之前就關閉了該會話。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM