我最近转而使用我们的数据库来为我们的用户管理 PHP 会话。我实现的数据库会话处理程序在很大程度上与这个相同。
话虽如此,我遇到了一些奇怪的行为。在单个页面加载时,PHP 会话 ID 会更改几次。例如,下面的输出在我_write
的session_set_save_handler()
调用中使用 file_put_contents 在一页加载期间写入文件。
我已经搜索了代码,并且session_regenerate_id()
从未被调用过,也从未被调用过session_id(<new_id>)
。此外,我的 php.ini 将 session.auto_start 设置为Off
. 基本上,鉴于上述事实,我不知道会话 ID 如何在一页加载中发生变化。
我注意到它的原因是因为REPLACE INTO
链接到网页的 SQL 语句在我的数据库中创建了大约 8 行(每个额外的不同会话 id 一个)。如您所见,其中一个重复了四次左右。这恰好是唯一一个在放入数据库时也具有与之关联的数据的会话 ID。
f951tbvjkc8c5mv25aakfhoq86
f951tbvjkc8c5mv25aakfhoq86
f951tbvjkc8c5mv25aakfhoq86
f951tbvjkc8c5mv25aakfhoq86
eodjh2vhuo5ni1b7ia5ro6itf7
bada69955ld96fks0g057pp7i2
4n4c00ddlolb9k2t3uh2h66v37
lsqhhmfsund3bp3ocotcrj0l05
qvfe3qp6nupokcncp8jja8tsk0
4qfp9m3knabs88t6n1fkjo8oq6
g52du9v2fcsak27tjo7519q7j0
值得注意的是,我正在加载的页面中有一些对我们自己的服务器的 AJAX 请求。此外,这种行为不会发生在我们网站上的所有页面加载中。到目前为止,我已将范围缩小到发出几个不同 AJAX 请求的这一页。
想法?
更新:我的服务器中有以下虚拟主机作为自定义域的通配符。注释掉的行是我认为是什么原因造成的。当我对此发表评论时,它似乎工作正常。有了它,它似乎会导致奇怪的行为。
<VirtualHost *:80>
DocumentRoot "/opt/local/www/mysite.com"
ServerName default
ServerAlias *
ErrorLog "/opt/local/apache2/logs/mysite.com-error.log"
CustomLog "/opt/local/apache2/logs/mysite.com-access.log" common
<Directory "/opt/local/www/mysite.com">
AllowOverride All
php_value session.save_path "/opt/local/www/mysite.com/sessions"
#php_value session.cookie_domain "mysite.local"
php_value auto_prepend_file "/opt/local/www/mysite.com/core.php"
</Directory>
</VirtualHost>