Подтвердить что ты не робот

Ошибки обработки 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(); но результаты одинаковы.

4b9b3361

Ответ 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

Вы можете исправить проблему, выполнив следующие действия:

  1. Убедитесь, что папка существует с помощью sudo cd/var/lib/php/session. Если он не существует, sudo mkdir/var/lib/php/session или дважды проверьте журналы, чтобы убедиться, что вы указали правильный путь.
  2. Дайте папке полные права с помощью sudo chmod 777/var/lib/php/session.

Перезапустите сценарий, и он должен работать нормально, однако не рекомендуется покидать папку с полными разрешениями. В целях безопасности файлы и папки должны иметь только минимальные необходимые разрешения. Следующие шаги исправят это:

  1. Вы уже должны быть в папке сеанса, поэтому просто запустите sudo ls -l чтобы узнать владельца файла сеанса.
  2. Установите правильного владельца папки сеанса с помощью sudo chown user/var/lib/php/session.
  3. Предоставьте только владельцу права на полное чтение, запись и выполнение с помощью 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 должен был определить причину по-разному и сначала проверяя, есть ли файл сеанса, и еще одна ошибка, а не ошибка разрешения

Ответ 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 - это помогло мне избавиться от таких ошибок.