БлогNot. PHP: 12 причин, по которым не работают сессии

PHP: 12 причин, по которым не работают сессии

Хотя PHP последних версий стал работать с сессиями гораздо лучше, начинающие (а порой и опытные) программисты всё ещё нередко мучаются с ними, особенно если речь идёт об адаптации старого кода к новым версиям. В этой заметке я собрал самые распространённые причины, по которым могут не работать сессии (авторизация не выполняется, вход на сайт происходит только со второго раза и т.п.)

Сначала разумные причины:

1. Сессия не запущена.

То есть, не вызывалась функция session_start. Самая банальная и самая частая причина. Вызов session_start должен выполняться на каждой странице, где используются данные из массива $_SESSION.

Лучше всего вызывать session_start сразу после открывающего тега <?php

Я часто в запутанном коде из множества модулей делаю это в виде

 if (!isset($_SESSION)) session_start ();

Есть смысл также запускать сессию только из модуля с функциями, подключаемыми к каждой странице сайта кодом вроде этого:

 require_once ("functions.php");

2. Сессия или её данные удаляются из кода раньше, чем должны использоваться.

В сложных многомодульных скриптах это вполне возможно, тем более, сделать это можно несколькими способами - через функцию session_destroy, "прямой" очисткой массива сессии кодом вида $_SESSION = array(); или $_SESSION = []; или unset($_SESSION['name']) или просто unset($_SESSION); - в последнем случае, правда, сгенерируется предупреждение. "Прошерстите" код, чтобы убедиться, что этого не происходит.

3. Хранилище сессии недоступно для записи.

Выполните на хосте функцию phpinfo и проверьте значение session.save_path - это папка, куда сохраняется сессия.

Зайдите в неё и посмотрите, есть ли там свежие файлы с именами вроде sess_***** или *****.tmp. Если файлов нет - сессия не может сохраниться из-за отстутствия прав на доступ к папке. Установите их.

4. Данные сессии не записываются после отправки заголовка.

Если страница после выполнения кода редиректит на другую страницу при помощи функции header, может понадобиться добавить непосредственно после вызова header вызов функции session_write_close (или exit, die), чтобы сессия могла корректно записать данные.

5. В браузере не включены Cookies.

Механизм куки-файлов необходим для работы сессий. Проверьте, что куки разрешены в браузере.

6. В коде или настройках сайта происходит редирект с одного домена на другой.

При редиректе сессия потеряется, даже если это редирект с site.com на www.site.com или наоборот.

7. Некорректная работа со временем в скрипте.

Скрипт имеет тысячу и один способ использовать время, отличающееся от серверного, в том числе, ставить время для куки и т.п.

А что если в момент создания кука оказывается уже просроченной?

Неплохо также в файле .htaccess настроить часовой пояс явно, скажем

SetEnv TZ Asia/Krasnoyarsk
php_value date.timezone "Asia/Krasnoyarsk"

8. Устаревшие функции сессий.

Например, код всё ещё использует session_register, а она давно удалена из языка. Проверьте и другие функции сессий - нужно ли их все применять?

Мне сегодня помог п. 4 при "реанимации" работающего "со второго входа" сайтега.

Теперь причины более экзотические, которых, вроде бы, не должно быть, а они случаются.

9. На сайте нет файла favicon.ico или favicon.png

Некоторым бразуерам (Chrome) на некоторых серверах (nginx) это может помешать работе с сессиями, хотя понятных причин я назвать не могу.

10. У вас в файле кодировка UTF-8 с меткой BOM.

Избавьтесь от неё. Хотя, по идее, вы должны были увидеть раньше популярнейшее предупреждение (warning) "headers already sent" (см. по ссылке). Но бывает, что не усмотрел директивы отключения варнингов где-нибудь в недрах кода... Кстати, включите контроль всех ошибок при работе.

11. Лишние символы, например, пробелы после закрывающего тега PHP ?>

Что тут сказать? Избавьтесь от них.

12. Так легла карта.

Скорее всего, сессия просто стартует не там, где Вы думаете.

print_r($_SESSION);

везде по коду - и вперёд.

17.06.2021, 12:57 [2544 просмотра]


теги: список php памятка сервер ошибка