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

81

Я недавно обновился до 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, и приложение работает нормально. Что заставляет меня задуматься, под каким пользователем запускается сборщик мусора сеанса?

Итай Моав -Малимовка
источник
Я сделал, но не на 5.3. Оказалось, что это ошибка разрешений, которая была отфильтрована до пути сохранения сеанса. Я полагаю, вы проверили разрешения?
Джаррод Неттлз,
@Jarrod Я вижу, что www-данные могут читать и писать в эту папку (в которой сейчас есть w & r для всех, пользователя, группы и мира), я должен проверить что-то еще?
Итай Моав -Малимовка
Я предполагаю, что причина, по которой это происходит спорадически, заключается в том, что ошибка возникает при запуске сборщика мусора сеанса, который, как мне кажется, по умолчанию имеет 1% шанс запуска при инициализации сеанса. Вносили ли вы какие-либо изменения в php.ini, касающиеся сессий? Что здесь не по умолчанию? Проверьте владельца папки сеанса, после этого я в недоумении не вижу .ini или ошибок.
Джаррод Неттлз,
Владелец - root, сессии создаются по www-data, доступ к этой папке есть у всех. Пройду настройки ini одну за другой, поищу что-нибудь подозрительное.
Итай Моав -Малимовка
ps_files_cleanup_dir: opendir (/ var / lib / php5) failed: Permission denied (
Итай Моав -Малимовка,

Ответы:

121

Исправление: В вашем 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, также пытаются выполнить сборку мусора, что приводит к полученной вами ошибке.

Дивант Вайдья
источник
6
Я столкнулся с этой проблемой и в Ubuntu 10.04, но, проверив файл php.ini, я обнаружил, что он session.gc_probabilityуже установлен 0.
Джонатан
5
@Jonathan - Вы, вероятно, обнаружите, что тогда ваше приложение устанавливает значение.
SynackSA
3
@SynackSA Как ни странно, это когда я создать собственный, сайт конкретный файл php.ini, что, когда session.gc_probabilityспусковые до 1. Это произошло даже тогда , когда нет никаких настроек в файле php.ini бы то ни было ! Я запускаю suphp на Ubuntu, Apache 2.2. Интересно, это какая-то ошибка? В любом случае, добавление session.gc_probability = 0в мой собственный файл php.ini для конкретного сайта решает проблему.
Джонатан
2
@Jonathan Предполагается, что это именно так, поскольку значение по умолчанию равно 1
ROunofF
2
Это отключает сборку мусора сеанса. Возможно, вам стоит проверить, действительно ли cron очищает ваши сеансы.
hansgoed 01
23

Это типичная ошибка на серверах 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 (по умолчанию), другие пользователи на сервере могут захватить сеансы, получив список файлов в этом каталоге.

Мари Фишер
источник
2

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

Итай Моав -Малимовка
источник
2
Как упоминает Мари выше, это может создать проблему безопасности для любого рабочего сервера.
Kzqai
2
Я уже давно реализовал правильное решение :-) Но проблема безопасности в основном в общих серверах
Итай Моав -Малимовка
1
@pike Очистка сессий осуществляется php cli через CRON
Итай Моав -Малимовка
1

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

ChrisFNZ
источник