2013-04-01 99 views
4

在Code Igniter框架中存在一些這種行爲的示例 - 在方法的開始處使用它,並在方法結束之前創建一個變量,取消設置此變量。取消設置局部變量

他們爲什麼沒有設置它們?重點是什麼?據我所知,局部變量無論如何都會在方法結束時死亡。

代碼點火器,從會話類(見最後行):

function sess_read() 
{ 
    // Fetch the cookie 
    $session = $this->CI->input->cookie($this->sess_cookie_name); 

    // No cookie? Goodbye cruel world!... 
    if ($session === FALSE) 
    { 
     log_message('debug', 'A session cookie was not found.'); 
     return FALSE; 
    } 

    // Decrypt the cookie data 
    if ($this->sess_encrypt_cookie == TRUE) 
    { 
     $session = $this->CI->encrypt->decode($session); 
    } 
    else 
    { 
     // encryption was not used, so we need to check the md5 hash 
     $hash = substr($session, strlen($session)-32); // get last 32 chars 
     $session = substr($session, 0, strlen($session)-32); 

     // Does the md5 hash match? This is to prevent manipulation of session data in userspace 
     if ($hash !== md5($session.$this->encryption_key)) 
     { 
      log_message('error', 'The session cookie data did not match what was expected. This could be a possible hacking attempt.'); 
      $this->sess_destroy(); 
      return FALSE; 
     } 
    } 

    // Unserialize the session array 
    $session = $this->_unserialize($session); 

    // Is the session data we unserialized an array with the correct format? 
    if (! is_array($session) OR ! isset($session['session_id']) OR ! isset($session['ip_address']) OR ! isset($session['user_agent']) OR ! isset($session['last_activity'])) 
    { 
     $this->sess_destroy(); 
     return FALSE; 
    } 

    // Is the session current? 
    if (($session['last_activity'] + $this->sess_expiration) < $this->now) 
    { 
     $this->sess_destroy(); 
     return FALSE; 
    } 

    // Does the IP Match? 
    if ($this->sess_match_ip == TRUE AND $session['ip_address'] != $this->CI->input->ip_address()) 
    { 
     $this->sess_destroy(); 
     return FALSE; 
    } 

    // Does the User Agent Match? 
    if ($this->sess_match_useragent == TRUE AND trim($session['user_agent']) != trim(substr($this->CI->input->user_agent(), 0, 120))) 
    { 
     $this->sess_destroy(); 
     return FALSE; 
    } 

    // Is there a corresponding session in the DB? 
    if ($this->sess_use_database === TRUE) 
    { 
     $this->CI->db->where('session_id', $session['session_id']); 

     if ($this->sess_match_ip == TRUE) 
     { 
      $this->CI->db->where('ip_address', $session['ip_address']); 
     } 

     if ($this->sess_match_useragent == TRUE) 
     { 
      $this->CI->db->where('user_agent', $session['user_agent']); 
     } 

     $query = $this->CI->db->get($this->sess_table_name); 

     // No result? Kill it! 
     if ($query->num_rows() == 0) 
     { 
      $this->sess_destroy(); 
      return FALSE; 
     } 

     // Is there custom data? If so, add it to the main session array 
     $row = $query->row(); 
     if (isset($row->user_data) AND $row->user_data != '') 
     { 
      $custom_data = $this->_unserialize($row->user_data); 

      if (is_array($custom_data)) 
      { 
       foreach ($custom_data as $key => $val) 
       { 
        $session[$key] = $val; 
       } 
      } 
     } 
    } 

    // Session is valid! 
    $this->userdata = $session; 
    unset($session); 

    return TRUE; 
} 
+1

你能打擾我們展示的代碼,而不是寫這個故事? –

+0

當然,編輯:P – user2203484

+0

http://stackoverflow.com/questions/5030600/php-whats-the-benefit-of-unsetting-variables ......也許這可能會幫助你... –

回答

6

unset()銷燬指定的變量。但unset()沒有釋放PHP腳本消耗的內存,它釋放它供PHP腳本本身使用。它不強制立即釋放內存。 PHP的垃圾回收器會在它很快看到適合的意圖時執行它,因爲無論如何這些CPU週期是不需要的,或者是在腳本內存耗盡之前,無論先發生什麼都不需要。因此,如果你在一個循環中創建10M大小的變量10次,並在循環結束時取消設置(或重寫)它,則內存消耗應該低至10M +所有其他變量循環結束。

更多

What's better at freeing memory with PHP: unset() or $var = null

why UNSET and NULL are working in different ways