PHP会话处理错误

g2a*_*itz 22 php session

我在我send.php文件的最顶部有这个:

ob_start();
@session_start();

//some display stuff

$_SESSION['id'] = $id; //$id has a value
header('location: test.php');
Run Code Online (Sandbox Code Playgroud)

以下是我的test.php文件的最顶层:

ob_start();
@session_start();

error_reporting(E_ALL);
ini_set('display_errors', '1');

print_r($_SESSION);
Run Code Online (Sandbox Code Playgroud)

数据发送到时test.php,显示以下内容:

Array ( )

警告:未知:打开(/ var/lib/php/session/sess_isu2r2bqudeosqvpoo8a67oj02,O_RDWR)失败:第0行的未知权限被拒绝(13)

警告:未知:无法写入会话数据(文件).请在第0行的Unknown中验证session.save_path的当前设置是否正确(/ var/lib/php/session)

我只尝试过使用session_start(); 但结果是一样的.

kn3*_*n3l 31

看看你的消息

首先,它涉及到许可

/var/lib/php/session/

你必须检查文件权限更改模式 session.save_path

它涉及的第二件事/var/lib/php/session/

session.save_path

在php.ini中

[Session]
; Handler used to store/retrieve data.
session.save_handler = files

; Argument passed to save_handler. In the case of files, this is the path
; where data files are stored. Note: Windows users have to change this
; variable in order to use PHP's session functions.
; 
; As of PHP 4.0.1, you can define the path as:
; 
;     session.save_path = "N;/path"
; 
; where N is an integer. Instead of storing all the session files in
; /path, what this will do is use subdirectories N-levels deep, and
; store the session data in those directories. This is useful if you
; or your OS have problems with lots of files in one directory, and is
; a more efficient layout for servers that handle lots of sessions.
; 
; NOTE 1: PHP will not create this directory structure automatically.
;         You can use the script in the ext/session dir for that purpose.
; NOTE 2: See the section on garbage collection below if you choose to
;         use subdirectories for session storage
;
session.save_path = /tmp/    <= HERE YOU HAVE TO MAKE SURE

; Whether to use cookies.
session.use_cookies = 1
Run Code Online (Sandbox Code Playgroud)


You*_*nse 15

你有你的更改session.save_path设置的访问目录,/tmp/例如

如何更改:http://php.net/session_save_path

作为共享主机,建议在主目录内但在文档根目录下设置会话保存路径

还要注意

  • 这里不需要使用ob_start,
  • 而且我确定你偶然把@操作员放了,并且已经将它永远删除了,不是吗?

  • 当然.干得好 (2认同)
  • @Pekka 当然。/var 通常被挂载在大小有限的单独分区上,更不用说其他安全问题了 (2认同)

rob*_*ger 8

这是PHP版本中的一个已知错误.根据您的服务器环境,您可以尝试将sessions文件夹设置为777:

/var/lib/php/session (您的位置可能有所不同)

我最终使用了这个解决方法:

session_save_path('/path/not/accessable_to_world/sessions');
ini_set('session.gc_probability', 1);
Run Code Online (Sandbox Code Playgroud)

您必须创建此文件夹并使其可写.我没有多少搞乱权限,但777为我工作(显然).

确保世界无法访问您存储会话的位置.

这个解决方案可能不适用于所有人,但我希望它可以帮助一些人!

  • 从[第一条评论](http://stackoverflow.com/questions/5104065/php-session-handling-errors/11034977#comment14431008_11034977)(强调我的):"如果问题是重复的,找到一个规范的答案和答案那个,然后**标记其他人以供主持人注意,表明它们是重复的**." (4认同)

Dan*_*ray 7

您可以通过以下步骤解决该问题:

  1. 验证文件夹是否存在sudo cd /var/lib/php/session。如果它不存在,则sudo mkdir /var/lib/php/session或仔细检查日志以确保您具有正确的路径。
  2. 为该文件夹授予完全读写权限sudo chmod 666 /var/lib/php/session

重新运行您的脚本,它应该可以正常工作,但是,不建议保留该文件夹的完全权限。为了安全起见,文件和文件夹应该只具有所需的最低权限。以下步骤将解决该问题:

  1. 您应该已经位于会话文件夹中,因此只需运行sudo ls -l即可找出会话文件的所有者。
  2. 使用 来设置会话文件夹的正确所有者sudo chown user /var/lib/php/session
  3. 仅授予所有者完整的读写权限sudo chmod 600 /var/lib/php/session

注意

您可能不需要使用该sudo命令。


小智 5

转到您的PHP.ini文件或PHP.ini EZConfig在您的文件上找到Cpanel并将您设置session.save_path为通向该tmp文件的完整路径,即:/home/cpanelusername/tmp