Как получить сессию без вызова session_start - PullRequest
2 голосов
/ 21 апреля 2011

У меня сейчас есть страница кометы, что если я позвоню 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 ]

3 голосов
/ 21 апреля 2011

Обработчик сеанса PHP по умолчанию блокирует файл сеанса, пока он используется скриптом. Comet сохраняет скрипт-обработчик активным в течение длительного времени, что делает сеанс заблокированным. Вы можете обойти это, выполнив

session_start();
session_write_close();

в вашем скрипте кометы. Он заполнит $ _SESSION сохраненными данными, а затем закроет файл сеанса и снимет блокировку с него. Данные в $ _SESSION по-прежнему будут присутствовать и использоваться, и вы даже можете их изменить. Единственное отличие состоит в том, что если вы не выполните последующую session_start() в своем скрипте, эти изменения не будут записаны в файл сеанса на диске.

Таким образом, вы МОЖЕТЕ использовать регулярные сеансы PHP в своем скрипте, вам просто нужно позаботиться о том, чтобы все длительно работающие разделы закрывали сеанс до того, как этот раздел начнет выполняться.

3 голосов
/ 21 апреля 2011

Ваша работа может быть намного проще:

 <?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;    
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...