簡體   English   中英

PHP 會話處理錯誤

[英]PHP session handling errors

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

警告:未知:無法寫入會話數據(文件)。 請驗證 session.save_path 的當前設置是否正確 (/var/lib/php/session) in Unknown on line 0

我只試過使用 session_start(); 但結果是一樣的。

看你的留言

所以第一件事與許可有關

打開(/var/lib/php/session/sess_isu2r2bqudeosqvpoo8a67oj02,O_RDWR)失敗:第0行未知中的權限被拒絕(13)

你必須檢查文件權限更改模式這個/var/lib/php/session/

第二件事session.save_path

警告:未知:無法寫入會話數據(文件)。 請驗證 session.save_path 的當前設置是否正確 (/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

您必須將session.save_path設置更改為可訪問的目錄,例如/tmp/

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

在共享主機上,建議將會話保存路徑設置在主目錄內,但在文檔根目錄下

還要注意的是

  • 在這里不需要使用 ob_start,
  • 而且我確定您不小心放置了@ 運算符並且已經將其永久刪除,不是嗎?

這是 PHP 版本中的一個已知錯誤 根據您的服務器環境,您可以嘗試將會話文件夾設置為 777:

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

我最終使用了這個解決方法:

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

您必須創建此文件夾並使其可寫。 我沒有過多地處理權限,但是 777 對我有用(顯然)。

確保世界無法訪問您存儲會話的位置。

此解決方案可能不適用於所有人,但我希望它可以幫助某些人!

轉到您的PHP.ini文件或在您的Cpanel上找到PHP.ini EZConfig並將您的session.save_path設置為通向tmp文件的完整路徑,即: /home/cpanelusername/tmp

您可以通過以下步驟解決問題:

  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僅授予所有者完整的讀寫權限。

NB

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

我有同樣的錯誤,一切都是正確的,就像設置文件夾權限一樣。

就我而言,它看起來像是 php 中的一個錯誤,因為當我刪除我的 PHPSESSID cookie 時,它​​又在工作了,所以顯然有些東西搞砸了,會話被刪除了,但 cookie 仍然處於活動狀態,因此 php 必須以不同的方式定義原因並首先檢查是否會話文件仍然是他們並給出另一個錯誤而不是權限錯誤

使用最新的 WHM (v66.0.23) 時,您可以轉到 MultiPHP INI Editor 選擇 PHP 版本並將 session.save_path 設置為默認值,即 /var/cpanel/php/sessions/ea-php70 而不是以前的簡單 tmp - 這幫助我得到擺脫這樣的錯誤。

請確保session.save_pathphp.ini設置正確。 php 需要對設置此變量的目錄進行讀/寫訪問。

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

使用 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');

檢查您的 cpanels 空間。刪除未使用的文件或 error.log 文件,然后嘗試登錄您的應用程序(這對我有用);

我收到了這兩條錯誤消息以及另外兩條錯誤消息,並在發現我需要做的就是重新啟動 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

我正在使用 php-5.4.45 並且遇到了同樣的問題。

如果您是 php-fpm 用戶,請嘗試編輯 php-fpm.conf 並將 listen.owner 和 listen.group 更改為正確的。 我的 nginx 用戶是 apache,所以在這里我將這些參數更改為 apache,然后它對我來說效果很好。

對於 apache 用戶,我想你應該編輯你的 fast-cgi 參數,參考我上面提到的兩個參數。

如果您使用配置的虛擬主機並發現相同的錯誤,那么您可以覆蓋<VirtualHost *:80>下的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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM