PHP 会话处理错误

Posted

技术标签:

【中文标题】PHP 会话处理错误【英文标题】:PHP session handling errors 【发布时间】:2011-07-03 12:12:19 【问题描述】:

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

ob_start();
@session_start();

//some display stuff

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

在我的 test.php 文件的最顶部有以下内容:

ob_start();
@session_start();

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

print_r($_SESSION);

当数据发送到test.php时,显示如下:

Array ( )

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

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

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

【问题讨论】:

我不确定这是否是您问题的确切解决方案。但是,由于您在处理 test.php 之前没有显示任何内容,因此 IMO 您应该尝试使用 ob_end_flush();在 send.php 的末尾并删除 test.php 中的 ob_start(); PHP session permission problem 的可能重复项 我目前想知道如果 PHP 确实输出了这样的错误消息,默认情况下包裹在 <script>alert("...")</script> 中是否会有所帮助。 重启浏览器后这条消息消失了。 今天我遇到了同样的错误,我通过 Chrome 中的 reset setting to default 解决了。 【参考方案1】:

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

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

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

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

注意

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

【讨论】:

为什么是700 (7=rwx)?这里真的需要“执行”吗?将权限设置为600 (rw) 也应该有效? @Awaaaaarghhh 是的,你是对的。我将编辑我的答案。【参考方案2】:

看看你的消息

首先与权限有关

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

你必须检查文件权限 更改模式 /var/lib/php/session/

第二件事session.save_path有关

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

在 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

【讨论】:

这可行,但是当服务器重新启动时,它似乎回到了 0666 的旧方式并由“root”拥有如何解决?【参考方案3】:

使用最新的 WHM (v66.0.23) 时,您可以转到 MultiPHP INI 编辑器选择 PHP 版本并将 session.save_path 设置为默认值,即 /var/cpanel/php/sessions/ea-php70 而不是以前的简单 tmp - 这有助于我要摆脱这些错误。

【讨论】:

【参考方案4】:

如果您使用配置的虚拟主机并发现相同的错误,那么您可以覆盖 &lt;VirtualHost *:80&gt; 下的默认设置 php_value session.save_path

#
# Apache specific PHP configuration options
# those can be override in each configured vhost
#
php_value session.save_handler "files"
php_value session.save_path    "/var/lib/php/5.6/session"
php_value soap.wsdl_cache_dir  "/var/lib/php/5.6/wsdlcache"

使用 chmod 777 将路径更改为您自己的 '/tmp'

【讨论】:

【参考方案5】:

我正在使用 php-5.4.45,我遇到了同样的问题。

如果您是 php-fpm 用户,请尝试编辑 php-fpm.conf 并将 listen.owner 和 listen.group 更改为正确的。我的 nginx 用户是 apache,所以在这里我将这些更改为 params 为 apache,然后它对我来说效果很好。

对于 apache 用户,我想你应该编辑你的 fast-cgi 参数,参考我上面提到的两个参数。

【讨论】:

【参考方案6】:

我遇到了同样的错误,就像设置文件夹权限一样,一切都是正确的。

在我的情况下,它看起来像 php 中的一个错误,因为当我删除我的 PHPSESSID cookie 时,它​​又开始工作了,所以很明显有些事情被搞砸了,会话被删除但 cookie 仍然处于活动状态,所以 php 必须以不同的方式定义原因,并且首先检查会话文件是否仍然是它们并给出另一个错误而不是权限错误

【讨论】:

我只是遇到了类似的问题。站点在一台 PC 上工作,而不是在另一台 PC 上工作。删除PHPSESSID cookie 解决了这个问题。不过,我仍然不知道真正的问题是什么。【参考方案7】:

我收到了这两个错误消息以及另外两个错误消息,并在发现我需要做的就是重新启动 XAMPP 之前摆弄了一段时间!我希望这可以帮助其他人避免浪费同样的时间!

Warning: session_start(): open(/var/folders/zw/hdfw48qd25xcch5sz9dd3w600000gn/T/sess_f8bgs41qn3fk6d95s0pfps60n4, O_RDWR) failed: Permission denied (13) in /Applications/XAMPP/xamppfiles/htdocs/foo/bar.php on line 3

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /Applications/XAMPP/xamppfiles/htdocs/foo/bar.php:3) in /Applications/XAMPP/xamppfiles/htdocs/foo/bar.php on line 3

Warning: Unknown: open(/var/lib/php/session/sess_isu2r2bqudeosqvpoo8a67oj02, O_RDWR) failed: Permission denied (13) in Unknown on line 0

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

【讨论】:

【参考方案8】:

检查您的 cpanels 空间。删除未使用的文件或 error.log 文件,然后尝试登录您的应用程序(这对我有用);

【讨论】:

【参考方案9】:

当使用 header 函数时,php 不会触发当前会话的关闭。您必须使用session_write_close 关闭会话并从会话文件中移除文件锁定。

ob_start();
@session_start();

//some display stuff

$_SESSION['id'] = $id; //$id has a value
session_write_close();
header('location: test.php');

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

这是 PHP 版本中的 known bug。根据您的服务器环境,您可以尝试将会话文件夹设置为 777:

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

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

session_save_path('/path/not/accessable_to_world/sessions');
ini_set('session.gc_probability', 1);

您必须创建此文件夹并使其可写。我没有过多地处理权限,但 777 对我有用(显然)。

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

此解决方案可能不适用于所有人,但我希望它对某些人有所帮助!

【讨论】:

这可能是最好的选择,但是THE 应该派人去哪一个呢?并且发布“去看看这里”真的是一个答案吗?如果不及时,答案是相关的。是否有一些我不知道的规则?如果它相关且简洁,它就不是垃圾邮件。我认为这个答案是恰当而直接的。 如果它一直是 same 就是垃圾邮件。也就是说,如果问题是重复的,则将它们标记为重复,我们将对其进行查看。如果它们是合法重复的,那么由于这涉及错误报告,请留下对问题的评论表明这是一个错误,然后标记它过于本地化。 来自first comment(强调我的):“如果问题是重复的,请找到一个规范答案并回答,然后标记其他问题以引起主持人注意,表明它们是重复的。” 将文件夹设置为 777 权限应该只是一种快速修复,因为它可能会导致安全风险。请参阅我的答案以获得更完整和更安全的解决方案。【参考方案12】:

您必须将 session.save_path 设置更改为可访问的目录,例如 /tmp/

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

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

还要注意

这里不需要使用 ob_start, 我敢肯定,您是不小心把 @ 运算符放在了这里,并且已经打算永远删除它了,不是吗?

【讨论】:

我也想知道如何 这个可以通过脚本修改吗?还是必须修改php.ini 将会话存储在/var/lib/php/ 的子目录中是否总是并且 100% 肯定是错误的? (我不是 Unix/Linux 专家,所以我不知道。)有人必须在某个时候专门设置这个 @Pekka 当然。 /var 通常被挂载在大小有限的单独分区上,更不用说其他安全问题【参考方案13】:

请确保session.save_pathphp.ini 中设置正确。 php 需要对设置此变量的目录进行读/写访问。

更多信息:http://www.php.net/manual/en/session.configuration.php#ini.session.save-path

【讨论】:

我不推荐后者。

以上是关于PHP 会话处理错误的主要内容,如果未能解决你的问题,请参考以下文章

Symfony:自定义会话保存处理程序最大执行时间

PHP基础PHP教程(错误处理异常处理)

php错误处理

PHP:自定义错误处理程序 - 处理解析和致命错误

php 中的错误处理机制

PHP7 错误处理