#Когда возникает проблема и как её отличить
После перехода на PHP 8 session_start() может не открыть или не сохранить сеанс, если веб-обработчик не имеет доступа к каталогу session.save_path, путь не существует либо включён иной обработчик хранения.
#Возможные причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Неверный каталог храненияФайловый обработчик ищет каталог, которого нет или к которому нет доступа. | Журнал сообщает Failed to read session data или open(..., O_RDWR) failed | Проверить эффективный session.save_path и наличие каталога. |
| Нет прав у пользователя PHP-FPMПроцесс сайта не может создавать файлы сеансов в папке. | В системном журнале Permission denied | Проверить пользователя пула и права лишь нужной папки. |
| Другой способ сохраненияПроверка каталогов не поможет при хранении в Redis или базе. | В конфигурации session.save_handler указан redis или пользовательский обработчик | Диагностировать фактически выбранный обработчик. |
#Пошаговая диагностика и исправление
- Сохраните исходное сообщениеВ журнале ошибок PHP найдите сообщения
session_start():и путь послеopen(. Уточните время и пользователя сайта. При ошибке входа в аккаунт сначала предупредите пользователей о возможном разрыве сеансов; перед изменением настройки сохраните копию конфигурации сайта и файлы приложения. - Посмотрите фактические настройки веб-PHPВ панели сайта откройте настройки PHP. Для закрытого теста выполните скрипт с
session_module_name()иini_get("session.save_path")и запишите только эти значения в закрытый журнал. На работающем веб-сайте настройки могут отличаться отphp -iв терминале. Не публикуйте идентификаторы сессий или cookies. - Определите способ хранения сеансаЕсли
session_module_name()возвращаетfiles, посмотрите путь. Пустое значениеsession.save_pathозначает использование каталога по умолчанию, зависящего от сборки/сервера; не предполагайте, что это всегда/tmp. Если указанredisили пользовательский обработчик, обратитесь к настройкам соответствующего сервиса вместо проверки прав локального каталога. - Проверьте существование и доступность директорииВ терминале под администратором или владельцем каталога выполните
ls -ld /реальный/путь, предварительно подставив значение из настроек. Команда не меняет права; в выводе проверьте владельца, группу и биты доступа. Если путь указывает на несуществующий каталог, создайте его через штатные средства хостинга и настройте минимально необходимые права для пользователя конкретного PHP-FPM. - Не расширяйте права на весь сайтНе применяйте
chmod 777и не меняйте владельца рекурсивно. Для Debian/Ubuntu, Fastpanel и других панелей права и пользователи различаются: проверьте учётную запись пула PHP-FPM в конфигурации сервера или запросите сведения у администратора. Создавать и изменять каталог должен уполномоченный пользователь; после настройки проверьте доступ на создание файла от имени обработчика. - Испытайте вход и повторный запросНа тестовом сайте откройте страницу входа в режиме приватного окна, выполните авторизацию, перейдите на другую страницу и обновите её. Сеанс должен сохраняться; в журнале не должно быть ошибок
session_start(). Очистка каталога действующих сеансов разлогинит пользователей, поэтому её не проводите как универсальный способ исправления. - Дополнительная команда по темеLinux · Терминал (Bash)КомандаОбычный терминал Linux, чтение метаданных каталога; замените путь на значение session.save_path. Ничего не изменяет.
ls -ld /реальный/путь
#Как проверить, что проблема устранена
После нескольких запросов одного браузера сервер должен узнавать сеанс, а в журнале PHP должны исчезнуть ошибки чтения и записи файлов. Если нет — сверьте путь и обработчик сеансов именно в PHP-FPM, а не в CLI.
#Если ошибка осталась
Повторите исходный сценарий в тестовой среде, откройте свежую запись журнала с точным временем, именем функции, файлом и строкой. Сравните новое сообщение с исходным: ошибка могла переместиться на следующий участок кода. Не подавляйте все ошибки общим обработчиком. Если изменения затрагивали работающий проект, восстановите сохранённую копию и разберите новое сообщение до повторного переноса.