2011-04-21 3 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; 
      } 
     } 
     ... 

세션을 가져 오는 더 좋은 방법이 있습니까? vars thats 이 세션 파일에 들어 가지 않습니까?

+2

당신이 근본적인 문제 (왜'session_start()'가 멈추는 지)를 해결해야한다고 생각합니다. 대신 –

+0

@James C가 제 질문이었습니다. 그리고 그것은 session_start를 제거하여 해결되었습니다. 혜성 무한 프레임 - http://stackoverflow.com/questions/5553830/how-do-i-refresh-the-session-in-comet – Neal

+0

@ 제임스, 이것은 PHP에 제한이 있다는 사실 때문에 동일한 ID를 가진 두 개의 세션이있는 것 – Neal

답변

3

의 주위에 당신의 작업은 훨씬 간단 할 수 있습니다 : 그것은 스크립트에서 사용하고있는 동안

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

+0

경고 : session_start() [function.session-start] : 세션 쿠키를 보낼 수 없다 - 헤더가 이미 (출력은 /var/www/html/live_mockup/comet/output.php:63에서 시작되었습니다) /var/www/html/live_mockup/comet/output.php on line 56'에서 보내지 만, 그렇지는 않습니다. 문제? – Neal

+0

초마다 문제가 없어야하며 전송되는 헤더에 대해 불만을 토로하기는하지만 (id가있는 쿠키 전송) 필요한 이유가 이미 성공했기 때문에 안전하게 무시할 수 있습니다. 경고를 무시하는 것이 100 % '깨끗한'것은 아니지만 좋은 이유가있을 수 있지만 경고가없는 해결책을 찾을 수 있는지 확인합니다. – Wrikken

3

PHP의 기본 세션 핸들러가 세션 파일을 잠급니다

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

당신은 같은 몇 가지 도우미 기능을 쓸 수있다 . Comet은 핸들러 스크립트를 오랫동안 활성화시켜 세션을 잠근 상태로 유지합니다. Comet 스크립트에

을 수행하면 해결할 수 있습니다. $ _SESSION에 저장된 데이터가 채워지고 세션 파일을 닫고 잠금을 해제합니다. $ _SESSION의 데이터는 여전히 존재하고 사용할 수 있으며 변경할 수도 있습니다. 유일한 차이점은 스크립트에서 후속 session_start()을 수행하지 않으면 이러한 변경 사항이 디스크상의 세션 파일에 기록되지 않는다는 것입니다.

스크립트에서 일반 PHP 세션을 사용할 수 있으므로 장기 실행 섹션에는 세션이 실행되기 전에 세션이 닫히도록주의해야합니다.

+0

soo close @marc. 고마워요^_ ^ – Neal

관련 문제