我在PHP中使用会话遇到了这个错误:有时(在刷新30-40页之后,很少在1页刷新后很少)会话变量(在上一页填写正确 - 我已经检查过了它的设置)是空的,如:array(0){ }
,但访问的那个会话的文件包含所需的内容,并且需要再刷新一次页面才能加载该会话数据(是的,我'检查两个页面上的会话ID是否真的相同)。有谁知道为什么会这样?怎么做才能避免这种情况"空阵列闪烁"?
澄清我正在做的事情:在主页面上,我将CSS字符串保存到会话变量中,并生成指向PHP脚本的链接标记。当broswer调用此脚本时,会从会话中加载CSS字符串并将其作为CSS文件输出。因此,它实际上只是正在刷新的主页面。
这个"空阵列闪烁"当我成功加载页面并且在另一个浏览器标签中加载其他网站时,也会出现,而不是我回到带有我的页面的选项卡并刷新它,我正在谈论的会话错误出现(以及之后的消失)下一次刷新我的页面,就像我上面描述的那样);但同样不是规则,它有时只会发生。
请考虑以下事项:
是的,session_start();
位于文件的开头
我使用纯PHP会话机制(使用简单的应用程序逻辑:只在会话变量下保存一个字符串并在下一页上检索它)
我使用本地服务器(MAMP),因此其他人的脚本不会在/temp
文件夹中意外删除
session.gc_probability = 1
,session.gc_divisor = 100
和session.gc_maxlifetime = 1440
,但它没有帮助;不同会话的生命周期也没有帮助,我也尝试过:session.use_cookies = 1
session.use_only_cookies = 1
session_start();
并且垃圾收集器尝试执行它的工作时,看起来确实会发生一些事情,但为什么会使用具有完全相同会话ID的相同会话文件比再执行一次(成功的)更新? I found something very similar being described here as:
所以我的猜测是,在服务器上的会话到期后,浏览器仍然拥有PHPSESSID cookie。如果它将它发送到服务器,服务器就无法找到会话,只是在$ _SESSION中放入一个空数组,让我一无所知。我希望这有助于有人遇到同样的问题。