2011-08-18 10 views
2

다음 코드는 잘 작동합니다.codeigniter에서 이상한 세션 동작

$somearray = getData(); 

$data = array(
    'user_display_name' => $userdisplayname, 
    'username' => $usernamefromdb, 
    'logged_in' => TRUE, 
); 
$this->session->set_userdata($data); // used to create user session 

이것은 codeigniter 및 sqlite와 잘 작동합니다.

하지만

$data = array(
    'user_display_name' => $userdisplayname, 
    'username' => $usernamefromdb, 
    'logged_in' => TRUE, 
    'arrdata' => $somearray 
); 

$this->session->set_userdata($data); // used to create user session 

코드가 끝났습니다 ... 문제가 될 수 있습니다. ?

var_dump($somearray) 할 때 정보를 보여줍니다. 세션에 대한 메모리 제한이 있습니까 ??

감사

+0

'$ somearray'의 내용은 무엇입니까? –

+0

그리고 어떤 버전의 codeigniter를 사용하고 있습니까? –

+3

쿠키는 4KB의 데이터 만 저장할 수 있습니다. [세션 클래스 CI] (http://codeigniter.com/user_guide/libraries/sessions.html) –

답변

1

(그것 만드는 당신이 생각과는 달리) CodeIgniter는 기본적 데이터베이스에있는 모든 세션 데이터를 저장하지 않습니다. Jose Adrian이 지적한대로 4KB로 제한되는 쿠키에 데이터를 저장합니다.

는 DB에있는 모든 세션 데이터를 저장이 교체 세션 클래스를 사용하려면 또한 쿠키에 저장보다 더 안전 할 것이다 http://codeigniter.com/wiki/OB_Session/

데이터베이스에 세션 데이터를 저장합니다.

4

내 응용 프로그램 중 하나에서 같은 문제가 나타났습니다. 문제를 디버깅하면 CodeIgniter가 다차원 배열의 serialization/unserialization을 제대로 구현하지 못한다는 것을 알 수 있습니다. 실제로 제출 된 버그가 있었으며, 버그를 수정했거나 수정하려고한다고 생각합니다. 코어에서 세션 라이브러리를 살펴보십시오.

function _serialize($data) 
{ 
    if (is_array($data)) 
    { 
     foreach ($data as $key => $val) 
     { 
      if (is_string($val)) 
      { 
       $data[$key] = str_replace('\\', '{{slash}}', $val); 
      } 
     } 
    } 
    else 
    { 
     if (is_string($data)) 
     { 
      $data = str_replace('\\', '{{slash}}', $data); 
     } 
    } 

    return serialize($data); 
} 

배열의 한 레벨 만 통과하며 슬래시를 가져 오는 유일한 레벨은 바뀝니다. 문제는 다차원 배열이 있고 거기에 직렬화를 버리고 세션을 삭제하는 데이터가 있다는 것입니다. 세션 라이브러리를 확장하고 다음 호출을 작성하여 문제를 해결했습니다.

class MY_Session extends CI_Session { 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

    function _serialize($data) 
    { 
     $data = $this->_serialize_backslash_recursive($data); 

     return serialize($data); 
    } 

    function _unserialize($data) 
    { 
     $data = @unserialize(strip_slashes($data)); 

     return $this->_unserialize_backslash_recursive($data); 
    } 

    function _serialize_backslash_recursive($data) 
    { 

     if (is_array($data)) 
     { 
      return array_map(array($this,'_serialize_backslash_recursive'), $data); 
     } 
     else 
     { 
      if (is_string($data)) 
      { 
       return str_replace('\\', '{{slash}}', $data); 
      } 
     } 

     return $data; 

    } 

    function _unserialize_backslash_recursive($data) 
    { 

     if (is_array($data)) 
     { 
      return array_map(array($this,'_unserialize_backslash_recursive'), $data); 
     } 
     else 
     { 
      if (is_string($data)) 
      { 
       return str_replace('{{slash}}', '\\', $data); 
      } 
     } 

     return $data; 

    } 

} 

이제 모든 레벨이 올바르게 적용됩니다. 시도해보고 그것이 효과가 있는지보십시오.