Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP5.3.3-在子目录中运行session_start()会终止现有会话_Php_Session - Fatal编程技术网

PHP5.3.3-在子目录中运行session_start()会终止现有会话

PHP5.3.3-在子目录中运行session_start()会终止现有会话,php,session,Php,Session,自从我的webhost不久前升级到PHP5.3.3以来,我一直在努力追踪一些恼人的会话问题。我已经确定,如果存在活动会话,则从子目录调用session_start()会终止现有会话。例如,我启动一个会话,一个用户登录到domain.com/index.php,然后用户导航到domain.com/members/,这将触发start_session()。。。用户的会话丢失 我已经找遍了,找不到类似的东西。是否有PHP配置可以解释这种行为?多次使用该版本的PHP调用session\u start()

自从我的webhost不久前升级到PHP5.3.3以来,我一直在努力追踪一些恼人的会话问题。我已经确定,如果存在活动会话,则从子目录调用session_start()会终止现有会话。例如,我启动一个会话,一个用户登录到domain.com/index.php,然后用户导航到domain.com/members/,这将触发start_session()。。。用户的会话丢失


我已经找遍了,找不到类似的东西。是否有PHP配置可以解释这种行为?

多次使用该版本的PHP调用
session\u start()
不会导致任何问题,但是还有其他可能的原因

一种可能的解释是,客户端浏览器没有将会话id发送回服务器。您可以通过比较两个页面生成的会话id来测试这一点。假设您有一个可以正确测试的受控环境,您可以使用来获取会话


也可能是用户正在访问不同的Web服务器。由于(默认情况下)PHP将会话存储到磁盘,因此多个服务器无法共享会话信息。如果这是一个共享主机,很可能这不是原因。但是,您可以使用
phpinfo()
来测试这一点。它应该提供足够的信息来确定它是否是同一台服务器。对于多服务器系统,我会考虑在memcache或mysql中存储会话。

如果会话在同一个目录中正常工作(您的问题不清楚),那么出现这种行为的唯一可能原因就是:“目录”cookie参数。
除了会话cookie参数的默认“/”之外,它似乎被设置为一些不寻常的值。
你得去看看

无论如何,如果没有HTTP交换日志,尝试任何与会话/cookie相关的问题几乎是无用的 您必须使用一些HTTP嗅探器,如LiveHTTPHeaders Firefox插件,以查看服务器发送的cookie头和客户端返回的cookie头。
否则一切都将在黑暗中拍摄


好的,从你那边的评论来看,会话id保持不变,因此,没有HTTP问题可以成为原因。这个问题变得有点棘手。 你能把你的测试脚本贴在这里吗

是否有PHP配置可以解释这种行为

是的,如果这些调用之间会话数据的存储不同,则会话的内容也会不同。可以配置存储,有关会话的所有配置选项,请参阅

接下来,如果PHP无法读取会话存储,您也将得到一个空数组

我不能告诉你这是否是你的问题所在,但可能会有帮助

顺便说一句,调用
session\u start()
而不是拥有一个空的
$\u session
通常是一个新会话已创建的标志。如果您在会话中使用cookie并输出以下内容,则可以验证这一点:

echo'',变量转储(headers\u list());

如果它包含会话的新cookie,则会话已使用此请求创建。

这里有很多好的建议。谢谢大家。周末我花了很多时间研究这个问题,但没能直接解决。最后,我向我的Web主机演示了这个问题发生在他的两个托管站点上,而不是在默认安装的PHP中。为了解决这个问题,我最终将所有登录和会话逻辑移到了一个类中。

我花了相当长的时间搜索、尝试和测试类似于同一个问题的内容。随着谷歌不断将我发送到这里,我认为分享解决方案可能会对其他人有所帮助(尽管我觉得在2011年的一个问题上发帖很奇怪):

/bar.php
中设置的会话变量未在
/foo/foobar.php
中设置

当我最终发现
http://www.example.com/bar.php
指向
http://example.com/foo/foobar.php
(缺少
www


更正html链接中的URL解决了这个问题。由于没有时间深入研究,我发现(在我的配置中)Apache没有任何区别,在有和没有
www
的情况下都会提供不同的页面,而PHP不会在它认为是两个不同的域
example.com
www.example.com
之间共享会话

想与大家分享另一个答案,答案如下:clayRay


我的回答是,我在根目录中保存了一个自定义的“php.ini”文件,并将这些指令移动到
ini\u set()
调用中解决了这个问题。如果您的主机允许,您也可以将这些问题推到
.htaccess

这是一个您应该向主机提出的问题,不同主机之间的配置是不同的,有点无法回答。我也会沿着这条路线走,但在这一点上运气不太好。我认为PHP会话应该是每个域,大多数情况下不是每个目录。cookie设置是什么(例如会话\u set\u cookie\u params()设置)?好主意。会话id将被保留,但在子目录中运行会话\u start()时,$\u会话全局数组将被清空。作为测试,我创建了一个简单的脚本,并将其复制到根目录和/包括目录中。在根目录中激发时,将保留会话并打印会话数组。在子目录中,会话ID保持不变,但会话数组为空。
session\u name()
也一样吗?正如我所说的-basic测试脚本。对于现有会话,在根目录中触发此会话将保留会话数组。在子目录中
echo '<pre>', var_dump(headers_list());