0

我最近转而使用我们的数据库来为我们的用户管理 PHP 会话。我实现的数据库会话处理程序在很大程度上与这个相同。

话虽如此,我遇到了一些奇怪的行为。在单个页面加载时,PHP 会话 ID 会更改几次。例如,下面的输出在我_writesession_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>
4

0 回答 0