2013-01-25 57 views
1

我正在查看Zend_Session的代碼,試圖更好地理解如何實現會話開始。在代碼中,他們做了一些我不太明白的事情。PHP Zend會話代碼逆向工程解釋

$hashBitsPerChar = ini_get('session.hash_bits_per_character');   
if (!$hashBitsPerChar) { 
    $hashBitsPerChar = 5; 
}   
switch($hashBitsPerChar) { 
    case 4: $pattern = '^[0-9a-f]*$'; break; 
    case 5: $pattern = '^[0-9a-v]*$'; break; 
    case 6: $pattern = '^[0-9a-zA-Z-,]*$'; break; 
}   
if(!preg_match('#'.$pattern.'#', $id)){    
    session_id(md5(session_id()));    
    $regenerateId = true; 
} 

什麼我遇到困難的理解是爲什麼他們有具有不(^)的模式,然後,如果它不匹配,他們開始會話之前創建一個臨時會話ID。這對我來說沒有任何意義 - 爲什麼他們對沒有0-9a-zA-Z-,?我只是不太明白這裏發生了什麼,想要了解。

謝謝

回答

1

正則表達式中的插入符不顛倒模式;它是匹配行首的錨點。

取決於配置爲session.hash_bits_per_character的值,則該方法選擇特定的正則表達式(零或更多的的匹配任一[0-9a-f][0-9a-v],或[0-9a-zA-Z-,]),爲會話標識符識別圖案。

如果沒有匹配(!preg_match(...))與當前會話標識符匹配(如果它不匹配三種模式之一),則重新生成會話標識符;當前會話標識符的MD5散列成爲新的會話標識符,並且設置標誌以指示再生已經發生。