会话背后的故事是什么


What is the story behind session

简单地说,我已经受够了会话,那么这个会话的最佳服务器设置是什么。

示例假设我们有两个文件[a.php和b.php]

a.php代码

<?php
session_start();
$_SESSION['msg'] = "Hello world";
header("Location: b.php");
exit;
?>

b.php代码

<?php
session_start();
echo $_SESSION['msg'];
unset($_SESSION['msg']);
?>

是的,是的,它对你们很多人都有效,但我想知道为什么它在某些主机上对我有效,并提供以下php信息查看

PHP INFO(WORKS)PHP版本5.3.8 register_globals=On

示例作品

当它不工作时在我的第二个主机上有以下信息

PHP信息(无效)PHP 5.2.17版本register_globals=On

示例不起作用,给出0

为什么?php服务器设置有什么问题,我真的很沮丧,因为我的网站完全依赖于这些会话作为警报:(

感谢您帮助我

会话在标头中发送,您使用Location标头重定向。根据PHP.net,header()函数一次只发送1个标头。我认为您在服务器向用户发送会话标头之前进行重定向。我可能错了,所以用元刷新进行测试,看看会发生什么。是的,它被弃用了,但在这里测试会很好:

echo '<meta http-equiv="refresh" content="0;b.php">';

替换:

header("Location: b.php");

希望这对你有效

会话存储在两台服务器上的文件中(session.save_handler=files),但session.save_path不同:/var/php_sessions表示不工作的服务器,而'empty'表示正在工作的服务器(/tmp将被视为默认值)。

/var/php_sessions是否存在并且对您的web服务器用户(通常是apache、httpd或www数据)是可写的?您应该在/var/php_sessions中找到会话文件。将会话id与cookie提供的id相匹配。

另一个错误源可能是代理干扰。您的第二台服务器正在运行Nginx/Varnish,这两台服务器都可以配置为充当反向代理。

第二个服务器对.php请求的回答以"0"开头,这也让我很恼火。我可以理解b.php打印一个"0",但是a.php为什么要这样做呢?

亲眼目睹:

0<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">'n
^ <-- this is strange, isn't it?

你确定你上传了正确的.php吗?

另一方面,请检查您的Web服务器的错误日志。