【问题标题】:PHP Sessions will not carry over to other pagesPHP 会话不会转移到其他页面
【发布时间】:2015-01-10 00:55:58
【问题描述】:

经过多年的网站开发,在这种情况下,我遇到问题的同一个网站,我对正在发生的事情完全不知所措。 我有一个标准的 php 登录,由三个页面组成:

login.php 输入登录信息,checklogin.php 检查输入凭据然后 home.php 作为登陆页面

多年来,所有这些都运行得非常好,因为在那段时间里它们几乎没有改变。 现在,最近我搬到了托管公司,这显然意味着重新安装所有我喜欢的网络托管软件并将其配置为我的网站需要的艰巨任务。 所以无论如何,由于网站编码没有改变,我认为这一定是服务器问题,要么是服务器配置,要么是我错过的设置。

我现在已经工作了三天的配置设置,然后“噗”的一声,它不想再设置会话了。 我可以设置一个并显示它,但如果我尝试将它转移到另一个页面,它将无法正常工作。

谁能解释三天内发生了什么神奇的事情,决定毁掉一切?

一些注意事项:

  • 是的,我在我的目标网页上使用 session_start(); 以及我打算参加的任何会议。
  • 我使用这些标签让您了解我的服务器正在为网页运行哪些软件(因为我仍然不确定是什么原因造成的)
  • php 会话路径是/var/lib/php/sessions/ 具有正确的 Apache/nginx 权限
  • MySQL 正在收集数据,php 正在第 2 页设置会话,但随后第 3 页似乎丢失了会话。

这是我为测试它而进行的快速组合示例:

第 1 页:设置会话:

<?php
session_start();
require_once'../connect.php'; // Database connection
$user_info = mysql_fetch_array(mysql_query("SELECT * FROM users WHERE id = '1'"));

$_SESSION['myid'] = $user_info['id'];
$_SESSION['myuser'] = $user_info['username'];

// Echo the set sessions just to make sure they set

echo 'ID: ' . $_SESSION['myid'] . ' - Username: ' . $_SESSION['myuser'] . '';
echo '<br /><a href="/page2.php">Click here to take your sessions to the next page</a>';
?>

第 2 页:继续课程:

<?php
session_start();
echo 'ID: ' . $_SESSION['myid'] . ' - Username: ' . $_SESSION['myuser'] . '';
?>

从上面的基本示例可以看出,第 2 页应该显示我的会话,但它不会。 对此的任何帮助都非常感谢,这让我发疯,主要是因为不知道是什么原因造成的。 如果需要任何进一步的细节,请告诉我,我会尽量详细说明。

【问题讨论】:

  • 当您尝试在第 2 页上显示会话变量时,您是否得到任何错误或什么也没有? (一定要打开报错)还要确保tmp文件夹有剩余空间并且你有写权限!
  • 在打开 &lt;?php 标签 error_reporting(E_ALL); ini_set('display_errors', 1); 后将错误报告添加到文件顶部,看看它是否产生任何结果。我的测试成功了。
  • 好吧,现在我在我创建的两个测试页面上遇到了一个以前没有的错误:Warning: Unknown: write failed: No space left on device (28) in Unknown on line 0
  • @Equinox04 我认为您的 tmp 文件夹已满?

标签: mysql nginx centos php


【解决方案1】:

在这种情况下要做的第一件事是打开错误报告:

<?php
    error_reporting(E_ALL);
    ini_set("display_errors", 1);
?>

在那之后我猜你没有在你的tmp文件夹上写permission或者tmp文件夹是full

因此,请检查您对该文件夹的权限以及是否有剩余空间。

【讨论】:

  • 我已经设法将它固定在一台服务器上,/tmp/ 文件夹有一个 14GB 的数据库备份。哈。反正我的另外两台服务器似乎还是要固执的。我已经把这两个测试页放在上面,现在出现了这个错误:Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in Unknown on line 0 路径是正确的,所有三个服务器都具有相同的 php.ini 设置。它也有正确的权限。
  • @Equinox04 嗯好的!但是备份的提示很好吗?不是吗?;D
  • 哈哈,是的,谢谢 :) 一个固定,两个去。
  • @Equinox04 只是出于好奇:您只有 3 台服务器,对吧?还是有更多的服务器需要修复:D?
  • @Equinox04 你有文件夹吗/var/tmp 因为如果这个文件夹满了可能会影响保存会话数据!
【解决方案2】:

您的服务器运行的是什么版本的 PHP?由于升级到 PHP v5.4(?不确定),我最近失去了登录身份验证。

基本上,session_is_registered 已被贬低并消失了。我切换到验证会话身份:

if(isset($_SESSION['valid_user']))

这可能不是最安全的改编,但它适用于我的低安全性网站。

【讨论】:

  • 我在所有三台服务器上运行 php 5.3。但是,关于您的建议,我从未使用过 session_is_registered(); 函数。对于登录页面的身份验证,我一直都支持你现在的做法。 if(!isset($_SESSION['logged_in'])){ // Return to login }else{ // Show page } 可能不是最有效的方法,但它可以满足我的需要。
【解决方案3】:

好吧,我终于找出了哪里出错了,所以我会为遇到同样问题的人解释一下。

将 PHP 会话存储在 /var/lib/php/session 是我的主要问题,不是因为读/写权限,而是因为 / 目录的分区非常小并且充满了日志。

一个快速的解决方法是删除日志和其他任何杂乱的目录,但我个人将会话存储目录移动到更大的分区:/home

您可以在您的 php.ini 文件中执行此操作,该文件可能设置为 /tmp/var/lib/php/session

; session.save_path = "/home"

您需要重新启动您正在运行的任何 php 服务和/或 Web 服务器以重新加载 php.ini,在我的情况下是 nginx 和 php-fpm

$ service nginx restart
$ service php-fpm restart

(取决于您的操作系统)您可以通过以下方式检查服务器上的分区大小:

$ df -h

这应该给你这样的东西:

> df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       50G  6.1G   41G  13% /
tmpfs                  12G     0   12G   0% /dev/shm
/dev/sdb1             477M   60M  392M  14% /boot
/dev/mapper/VolGroup-lv_home
                      409G   71M  388G   1% /home

所以只需选择您喜欢的分区并将其设置为 php.ini 中的会话路径

感谢所有评论试图帮助解决我的问题的人:)

【讨论】:

  • 很高兴你想出来了! (顺便说一句:您可以接受自己的答案!,也可以为我的努力点赞)
猜你喜欢
  • 2017-09-11
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
相关资源
最近更新 更多