PHP会话数据未保存
我遇到了一种"我发誓我没碰服务器"的情况。老实说,我没有碰过任何PHP脚本。我遇到的问题是php数据没有保存在不同的页面或者页面刷新中。我知道一个新的会话正在正确创建,因为我可以设置一个会话变量(例如$ _SESSION ['foo'] =" foo"并将其打印回同一页就可以了。但是当我尝试使用相同的变量时在另一页上未设置!我可以在主机服务器上使用任何php函数或者信息以查看发生了什么事吗?
这是一个示例脚本,目前无法在我的主机的服务器上运行:
<?php session_start(); if(isset($_SESSION['views'])) $_SESSION['views'] = $_SESSION['views']+ 1; else $_SESSION['views'] = 1; echo "views = ". $_SESSION['views']; echo '<p><a href="page1.php">Refresh</a></p>'; ?>
页面刷新后," views"变量永远不会增加。我认为这对他们来说是个问题,但我想确保我首先不是一个完全的白痴。
这是我的主机服务器(PHP版本4.4.7)的phpinfo():
解决方案
使用phpinfo()
并检查session。*
设置。
也许信息存储在cookie中,而浏览器不接受cookie,诸如此类。
首先检查,然后返回结果。
我们还可以执行print_r($ _ SESSION);
以转储该变量并查看其内容...。
关于phpinfo(),session.save_path是有效的吗?Web服务器是否对此目录具有写权限?
希望这可以帮助。
递增之前,请检查"视图"的值。如果出于某种奇怪的原因,将其设置为字符串,那么当我们将其添加1时,它将始终返回1.
if (isset($_SESSION['views'])) { if (!is_numeric($_SESSION['views'])) { echo "CRAP!"; } ++$_SESSION['views']; } else { $_SESSION['views'] = 1; }
检查会话保存路径是否可由Web服务器写入。
确保我们已打开Cookie。(我忘记了将它们关闭以进行测试时会忘记)
将firefox与firebug扩展一起使用,以查看是否已设置cookie并将其传输回去。
与此无关的是,开始研究php5,因为php 4.4.9是php4系列的最后一个。
好吧,因为我在自己的服务器(PHP 5)上测试了代码,所以我们可以消除代码错误。
这是要检查的内容:
- 我们要在任何地方调用session_unset()或者session_destroy()吗?这些功能将立即删除会话数据。如果我将这些放在脚本的末尾,它将开始表现出完全像我们描述的那样。
- 它在所有浏览器中的作用都一样吗?如果它可以在一个浏览器上运行而不能在另一个浏览器上运行,则可能是在无法运行的浏览器上出现配置问题(即我们关闭了Cookie并忘记打开它们,或者误阻止了cookie)。
- 会话文件夹可写吗?我们无法使用is_writable()对此进行测试,因此我们需要转到文件夹(从phpinfo()看起来类似于/ var / php_sessions),并确保会话实际上已创建。
我知道一个解决方案(OSX和Apache 1并刚切换到PHP5),当我遇到类似的问题时,就是取消设置1个特定键(即unset($ _ SESSION ['key']);)导致它无法保存。一旦我不再取消设置该密钥,它就会保存下来。除了在另一个站点上的服务器上,我再也没有看到这种情况,但是那是一个不同的变量。两者都没什么特别的。
这是我在其他评论中没有看到的一个常见问题:主机是否正在运行某种缓存?如果它们以某种方式自动缓存结果,我们将得到这种行为。
感谢我们提供所有有用的信息。事实证明,我的主机更改了服务器并开始使用/ var / php_sessions以外的其他会话保存路径,该路径不再存在。一种解决方案是在我所有的脚本文件中声明ini_set('session.save_path','SOME WRITABLE PATH');
,但这会很麻烦。我与主机进行了交谈,他们明确地将会话路径设置为确实存在的真实路径。希望这可以帮助遇到会话路径问题的任何人。
只是想添加一点说明,如果我们不小心错过了页面上的session_start()语句,也会发生这种情况。
I know one solution I found (OSX with Apache 1 and just switched to PHP5) when I had a similar problem was that unsetting 1 specific key (ie unset($_SESSION['key']);) was causing it not to save. As soon as I didn't unset that key any more it saved. I have never seen this again, except on that server on another site, but then it was a different variable. Neither were anything special.
感谢这一位达里尔。这帮助了我。我正在删除会话变量,由于某种原因,它使会话无法提交。现在我只是将其设置为null(这对我的应用程序来说很好),并且可以正常工作。
检查我们是否正在使用session_write_close();在任何地方,我都在另一个会话之后使用此权限,然后尝试再次写入该会话,但它不起作用..因此,只需注释一下即可
如果我们在php5中设置了会话,则尝试在php4页面上阅读该会话,它可能找不到正确的位置!使页面具有相同的php版本或者设置session_path。
检查谁是脚本的运行文件夹的组和所有者。如果组ID或者用户ID错误,例如设置为root,将导致会话无法正确保存。
遇到同样的问题,发生在我身上的是我们的服务器管理员将session.cookie_secure布尔值更改为On,这意味着cookie仅通过安全连接发送。由于找不到cookie,因此php每次都会创建一个新会话,因此不会看到会话变量。