Ошибки обработки 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 ( )
Предупреждение: Неизвестно: open (/var/lib/php/session/sess_isu2r2bqudeosqvpoo8a67oj02, O_RDWR) не удалось: разрешение отклонено (13) в Unknown в строке 0
Предупреждение: Неизвестно: Не удалось записать данные сеанса (файлы). Убедитесь, что текущая настройка session.save_path верна (/var/lib/php/session) в Unknown в строке 0
Я пробовал использовать session_start(); но результаты одинаковы.
Ответы
Ответ 1
Посмотрите на ваше сообщение
Итак, во-первых, это относится к разрешению
open (/var/lib/php/session/sess_isu2r2bqudeosqvpoo8a67oj02, O_RDWR) завершился ошибкой: в доступе отказано (13) в поле "Неизвестно" в строке 0
Вы должны проверить режим изменения прав доступа к этому файлу /var/lib/php/session/
Во-вторых, это относится к session.save_path
Предупреждение: неизвестно: не удалось записать данные сеанса (файлы). Пожалуйста, убедитесь, что текущий параметр session.save_path правильный (/var/lib/php/session) в поле Неизвестно в строке 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 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
Ответ 2
вам нужно изменить настройку session.save_path
на доступный каталог, /tmp/
например
Как изменить: http://php.net/session_save_path
Находясь на общем хосте, рекомендуется установить путь сохранения сеанса внутри вашего домашнего каталога, но ниже корня документа
также отметим, что
- использование ob_start здесь не требуется,
- и я уверен, что вы случайно поставили @оператора и уже собираетесь удалить его навсегда, не так ли?
Ответ 3
Это была известная ошибка в версиях PHP. В зависимости от вашей серверной среды вы можете попробовать установить папку сеансов на 777:
/var/lib/php/session
(ваше местоположение может отличаться)
В итоге я использовал этот обходной путь:
session_save_path('/path/not/accessable_to_world/sessions');
ini_set('session.gc_probability', 1);
Вам нужно будет создать эту папку и сделать ее доступной для записи. Я не очень много перепутал с разрешениями, но 777 работал у меня (очевидно).
Убедитесь, что место, где хранятся ваши сеансы, недоступно для всего мира.
Это решение может не работать для всех, но я надеюсь, что это поможет некоторым людям!
Ответ 4
Перейдите в свой PHP.ini
файл или найдите PHP.ini EZConfig
на Cpanel
и установите session.save_path
в полный путь, ведущий к файлу tmp
, т.е. /home/cpanelusername/tmp
Ответ 5
Вы можете исправить проблему, выполнив следующие действия:
- Убедитесь, что папка существует с помощью
sudo cd/var/lib/php/session
. Если он не существует, sudo mkdir/var/lib/php/session
или дважды проверьте журналы, чтобы убедиться, что вы указали правильный путь. - Дайте папке полные права с помощью
sudo chmod 777/var/lib/php/session
.
Перезапустите сценарий, и он должен работать нормально, однако не рекомендуется покидать папку с полными разрешениями. В целях безопасности файлы и папки должны иметь только минимальные необходимые разрешения. Следующие шаги исправят это:
- Вы уже должны быть в папке сеанса, поэтому просто запустите
sudo ls -l
чтобы узнать владельца файла сеанса. - Установите правильного владельца папки сеанса с помощью
sudo chown user/var/lib/php/session
. - Предоставьте только владельцу права на полное чтение, запись и выполнение с помощью
sudo chmod 700/var/lib/php/session
.
NB
Возможно, вам не нужно использовать команду sudo
.
Ответ 6
убедитесь, что session.save_path
правильно установлен в php.ini
. php нуждается в доступе чтения/записи к каталогу, в который установлена эта переменная.
Дополнительная информация: http://www.php.net/manual/en/session.configuration.php#ini.session.save-path
Ответ 7
У меня была такая же ошибка, что все было правильно, как настройка разрешений папки.
Похоже на ошибку в php в моем случае, потому что, когда я удаляю свой файл cookie PHPSESSID, он работал снова, так что что-то было испорчено, и сеанс был удален, но файл cookie по-прежнему активен, поэтому php должен был определить причину по-разному и сначала проверяя, есть ли файл сеанса, и еще одна ошибка, а не ошибка разрешения
Ответ 8
У меня была аналогичная проблема с PHP7 + Symfony 3.1.0 + Vagrant и она была решена. Надеюсь, это поможет кому-то:
PHP7 + Symfony 3.1.0 + Vagrant: не удалось записать данные сеанса
Ответ 9
При использовании функции заголовка 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
проверьте свой cpanels space.remove неиспользуемый файл или файл error.log, а затем попробуйте войти в свое приложение (эта работа для меня);
Ответ 11
Я получил эти два сообщения об ошибках вместе с двумя другими, и некоторое время искал их, прежде чем обнаруживать, что все, что мне нужно было сделать, - перезапустить 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
Ответ 12
Я использую php-5.4.45, и у меня такая же проблема.
Если вы являетесь пользователем php-fpm, попробуйте отредактировать php-fpm.conf и измените listen.owner и listen.group на правильную. Мой пользователь nginx - apache, поэтому здесь я меняю их на params на apache, тогда он работает хорошо для меня.
Для пользователя apache, я думаю, вы должны отредактировать параметры fast-cgi, ссылаясь на два параметра, о которых я упоминал выше.
Ответ 13
Если вы используете сконфигурированный vhost и обнаруживаете ту же ошибку, вы можете переопределить настройку по умолчанию 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"
Измените путь к вашему собственному '/tmp'
с помощью chmod 777.
Ответ 14
При использовании последнего WHM (v66.0.23) вы можете перейти в редактор MultiPHP INI, выбрать версию PHP и установить для параметра session.save_path значение по умолчанию ie/var/cpanel/php/sessions/ea-php70 вместо предыдущего простого tmp - это помогло мне избавиться от таких ошибок.