1

我正在查看 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-,?我只是不太明白这里发生了什么,并想了解。

谢谢

4

1 回答 1

1

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

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

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

于 2013-01-25T05:27:35.173 回答