PHP Zend 会话代码逆向工程解释


PHP Zend Session code reverse-engineering explanation

我正在查看Zend_Session的代码,以尝试更好地了解如何实现会话启动。在代码中,他们做了一些我不太理解的事情。

$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-,的预赛?我只是不太明白这里发生了什么,想了解。

谢谢

正则表达式中的插入符号不会反转模式;它是匹配行首的锚点。

根据为session.hash_bits_per_character配置的值,该方法选择一个特定的正则表达式([0-9a-f][0-9a-v][0-9a-zA-Z-,]的零个或多个匹配)作为会话标识符识别模式。

如果该模式与当前会话标识符不匹配(!preg_match(...))(如果它与三种模式之一不匹配),则重新生成会话标识符;当前会话标识符的 MD5 哈希将成为新的会话标识符,并设置一个标志以指示重新生成已发生。