PHP会话处理错误

时间:2011-02-24 11:33:55

标签: session php

我在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 ( )

     

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

     

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

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

13 个答案:

答案 0 :(得分:32)

查看您的消息

首先与权限相关的事情

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

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

第二件事session.save_path

有关

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中

[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

答案 1 :(得分:16)

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

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

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

还要注意

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

答案 2 :(得分:8)

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

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

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

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

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

确保世界无法访问您存储会话的地方。

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

答案 3 :(得分:4)

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:2)

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

  1. 验证文件夹是否存在sudo cd /var/lib/php/session。如果它不存在,则sudo mkdir /var/lib/php/session或仔细检查日志以确保您拥有正确的路径。
  2. 使用sudo chmod 777 /var/lib/php/session为文件夹授予完全权限。
  3. 重新运行脚本并且它应该正常工作,但是,不建议保留具有完全权限的文件夹。为了安全起见,文件和文件夹应该只具有所需的最低权限。以下步骤将解决这个问题:

    1. 您应该已经在会话文件夹中,因此只需运行sudo ls -l即可找到会话文件的所有者。
    2. 使用sudo chown user /var/lib/php/session设置会话文件夹的正确所有者。
    3. 仅使用sudo chmod 700 /var/lib/php/session授予所有者完整的读取,写入和执行权限。
    4. <强> NB

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

答案 6 :(得分:1)

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

在我的情况下,它看起来像是一个错误,因为当我删除我的PHPSESSID cookie时,它再次起作用,因此一些东西搞砸了,会话被删除但是cookie仍然是活动的,所以php必须以不同的方式定义原因首先检查会话文件是否仍然存在,并给出另一个错误而不是权限错误

答案 7 :(得分:0)

使用头函数时,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');

答案 8 :(得分:0)

检查你的cpanels space.remove unused file或error.log文件&amp;然后尝试登录你的应用程序(这项工作对我来说);

答案 9 :(得分:0)

我收到了这两条错误信息,还有其他两条错误消息,并且在发现我需要做的所有事情都重启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

答案 10 :(得分:0)

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

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

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

答案 11 :(得分:0)

如果您使用已配置的虚拟主机并找到相同的错误,则可以覆盖php_value session.save_path

下的<VirtualHost *:80>的默认设置
#
# 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'

答案 12 :(得分:0)

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

相关问题