我正在查看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 哈希将成为新的会话标识符,并设置一个标志以指示重新生成已发生。