Проблемы с PHP 5.3 и папкой сессий

Я недавно обновился до PHP 5.3, и с тех пор я получаю (спорадические) сообщения об ошибках, которые указывают на то, что Apache (или может быть очистителем файлов сеанса) не имеет прав доступа к папке, в которой хранятся сеансы.
Это происходит случайным образом и может не может быть воспроизведен с точными шагами, что привело меня к предположению, что это очиститель сеанса.
У кого-нибудь есть опыт с такими ошибками?

Сообщение об ошибке (которое запускается в строке session_start()):

ps_files_cleanup_dir: opendir (/ var / lib / php5) не удалось: в доступе отказано.

ls -ltr в каталоге сеанса дает:

drwx-wx-wt  2 root          root          4096 2010-05-25 12:39 php5

Внутри этого каталога я вижу файлы сеанса, принадлежащие www-data, который является моим Apache, и приложение работает нормально. Что заставляет меня задаться вопросом, под каким пользователем запускается сборщик мусора сеанса?


person Itay Moav -Malimovka    schedule 25.05.2010    source источник
comment
Я сделал, но не на 5.3. Оказалось, что это ошибка разрешений, которая была отфильтрована до пути сохранения сеанса. Полагаю, вы проверили разрешения?   -  person Jarrod Nettles    schedule 25.05.2010
comment
@Jarrod Я вижу, что www-данные могут читать и записывать в эту папку (в которой сейчас есть w & r для всех, пользователя, группы и мира), следует ли мне проверить что-то еще?   -  person Itay Moav -Malimovka    schedule 25.05.2010
comment
Я предполагаю, что причина, по которой это происходит спорадически, заключается в том, что ошибка возникает при запуске сборщика мусора сеанса, который, как я думаю, по умолчанию имеет 1% шанс запуска при инициализации сеанса. Вносили ли вы какие-либо изменения в php.ini, касающиеся сессий? Что здесь не по умолчанию? Проверьте владельца папки сеанса, после этого я в недоумении не вижу .ini или ошибок.   -  person Jarrod Nettles    schedule 25.05.2010
comment
Владелец - root, сеансы создаются по www-data, доступ к этой папке есть у всех. По очереди перебираю настройки ini, ищу что-нибудь подозрительное.   -  person Itay Moav -Malimovka    schedule 25.05.2010
comment
ps_files_cleanup_dir: opendir (/ var / lib / php5) не удалось: в доступе отказано (   -  person Itay Moav -Malimovka    schedule 25.05.2010
comment
@Itay Moav: www-data может читать и писать в эту папку - есть ли у нее выполнение? А вы проверили uid веб-сервера? Вы пробовали создать файл в этом каталоге (или файловой системе) как этот uid?   -  person symcbean    schedule 25.05.2010
comment
нет разрешений на выполнение, но их не должно быть. Я вижу, что файлы сеанса создаются правильно. www-data - пользователь веб-сервера   -  person Itay Moav -Malimovka    schedule 25.05.2010


Ответы (4)


Исправление: в вашем php.ini установите session.gc_probability на 0

Причина. Кажется, я нашел ответ здесь http://somethingemporium.com/2007/06/obscure-error-with-php5-on-debian-ubuntu-session-phpini-garbage

По сути, сборка мусора настроена на выполнение заданиями cron в некоторых системах (например, Ubuntu / Debian). Некоторые исполняемые файлы php ini, такие как php-cli, также пытаются выполнить сборку мусора, что приводит к полученной вами ошибке.

person Diwant Vaidya    schedule 01.06.2010
comment
Я столкнулся с этой проблемой и в Ubuntu 10.04, но, проверив php.ini, я обнаружил, что session.gc_probability уже установлен на 0. - person Jonathan; 26.02.2013
comment
@Jonathan - Вы, вероятно, обнаружите, что тогда ваше приложение устанавливает значение. - person SynackSA; 14.03.2013
comment
@SynackSA Как ни странно, это когда я создаю настраиваемый файл php.ini для конкретного сайта, когда session.gc_probability запускается на 1. Это происходило даже тогда, когда в файле php.ini нет никаких настроек вообще! Я запускаю suphp на Ubuntu, Apache 2.2. Интересно, это какая-то ошибка. В любом случае, добавление session.gc_probability = 0 в мой собственный файл php.ini для конкретного сайта, похоже, решает проблему. - person Jonathan; 06.04.2013
comment
@Jonathan Предполагается, что так и должно работать, поскольку значение по умолчанию - 1 - person ROunofF; 16.01.2015
comment
Это отключает сборку мусора сеанса. Вероятно, вам стоит проверить, действительно ли cron очищает ваши сеансы. - person hansgoed; 01.02.2016

Это типичная ошибка на серверах Ubuntu (я использую Lucid LTS). Разрешения по умолчанию для каталога / var / lib / php5 есть

drwx-wx-wt  2 root     root     4096 2011-11-04 02:09 php5

поэтому он может быть записан, но не прочитан веб-сервером, я думаю, это объясняет ошибки.

Поскольку в Ubuntu есть собственная очистка мусора с помощью cron (/etc/cron.d/php5), вероятно, лучше всего отключить сборку мусора php, как это было предложено выше Дивантом Вайдья.

session.gc_probability = 0

На самом деле существует причина, по которой папка сеанса не должна быть доступна для чтения всем - например, Руководство по PHP говорит:

Если вы оставите для этого параметра каталог, доступный для чтения всем, например / tmp (по умолчанию), другие пользователи на сервере могут захватить сеансы, получив список файлов в этом каталоге.

person Marie Fischer    schedule 04.11.2011

Решение, которое я в настоящее время использую (которое я не уверен, является правильным), заключается в передаче права собственности на папку сеанса пользователю Apache (www-data в моем случае).

person Itay Moav -Malimovka    schedule 25.05.2010
comment
Как упоминает Мари выше, это может создать угрозу безопасности для любого рабочего сервера. - person Kzqai; 15.06.2012
comment
Я давно реализовал правильное решение :-) Но проблема безопасности в основном связана с общими серверами. - person Itay Moav -Malimovka; 15.06.2012
comment
@pike Очистка сеанса выполняется php cli через CRON - person Itay Moav -Malimovka; 26.12.2012

Эта проблема уже давно меня беспокоит. Я изменил значение, как предложено в php.ini, и проблема продолжала возникать. Я нашел такое же значение конфигурации в моем index.php, а также в private / Zend / session.php. Так что стоит посмотреть немного глубже, если проблема продолжает возникать. Надеюсь, это кому-то пригодится.

person ChrisFNZ    schedule 03.07.2016