Не работает сессия как исправить

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 [4113 просмотров]


К этой статье пока нет комментариев, Ваш будет первым

как у вас все работает? city.php инклудится в index?

ini_set('session.gc_maxlifetime', 3600*24*30);
    ini_set('session.cookie_lifetime', 3600*24*30);
    session_start();

Сначала настраиваем сессию, потом вызываем.

session_destroy(); убираете, зачем она там вообще? Если вы делаете инклуд, то вы сначала стартуете сессию, потом ее грохаете. Какой смысл, если unset($_SESSION[‘locality’]); должно все что надо сделать.

Если перед session_start() будет что — либо выводиться(хтмл или ошибка) сессия стартовать не будет. То же касается и session_destroy();

Обычно если есть какие-либо ошибки их можно отследить в ерорлоге или включить вывод ошибок через настройку php.ini и понять какие проблемы возникли при создании сессии. В частности есть вариант что переполнен диск и сессии просто не создаются на диске.

Если это все у вас отдельные страницы(то есть есть еще страницы кроме index.php) во всех в начале должно быть session_start();, иначе сессии работать не будут. Эта директива создает связь куки в браузере и сессионной записи на сервере, без нее механизм сессий работать не будет, т.е. сессию нужно каждый раз «перестартовать».

С ошибками сессии SSL «0 -4», «0 -7» и «0 -19» часто сталкиваются владельцы банковских POS-терминалов Ingenico с GPRS/GSM модулем. В этой статье попробуем разобраться из-за чего возникают эти ошибки и как их исправить.

Ошибка сессии SSL: из-за чего возникает ошибка

Для начала разберемся, что вообще такое SSL и зачем он нужен в POS-терминалах. В «Википедии» написано следующее:

SSL (англ. Secure Sockets Layer — уровень защищённых сокетов) — криптографический протокол, который подразумевает более безопасную связь. Он использует асимметричную криптографию для аутентификации ключей обмена, симметричное шифрование для сохранения конфиденциальности, коды аутентификации сообщений для целостности сообщений. Протокол широко использовался для обмена мгновенными сообщениями и передачи голоса через IP (англ. Voice over IP — VoIP) в таких приложениях, как электронная почта, интернет-факс и др.

Всю статью сюда не буду копировать, если интересно почитайте на сайте «Википедии».

Если по нашей теме и простым языком, то SSL служит для обеспечения безопасной передачи данных о совершаемых платежах (сессия) между клиентским POS-терминалом, процессинговым центром и банком. Во время сессии SSL передаются такие данные, как идентификационный номер сессии (ID номер), сертификаты сторон, параметры шифрования и прочее.

Сам по себе протокол довольно «тяжелый» и для успешного завершения передачи данных требуется обеспечить надежный и стабильный канал связи, к которым GPRS 2G, к сожалению не относится. Высокая загруженность и маленькая ширина канала GPRS 2G (GSM) — это и есть основные проблемы из-за которой возникает ошибка сессии SSL.

Для лучшего понимания, — через сети GPRS 2G (GSM) передаются не только данные, но и почти весь голосовой трафик и ширины канала GPRS 2G (GSM) может попросту не хватить для успешного завершения обмена данными. А если в месте, где установлен терминал еще и сигнал слабый или сильно забитый канал, например крупный торговый центр, офисное здание или глухая деревенька, то обрывы связи почти гарантированы.

Такая же ошибка может возникнуть если у одной из сторон просрочен сертификат, но это крайне редкий случай — процессинг и банки строго следят за этим, к тому же процесс выпуска и перевыпуска сертификатов, как правило, полностью автоматизированы. С возникновением ошибки SSL из-за просроченного сертификата нам сталкиваться не приходилось.

Ошибка сессии SSL: как исправить

Самое главное — обеспечить стабильный канал связи для передачи данных. Других вариантов нет. Совсем нет. Но можно попробовать сделать следующее:

Переместить терминал в другое место. Если POS-терминал плохо работает в одном месте, попробуйте перенести его в другое помещение, — часто это помогает. Но не всегда есть такая возможность, например — касса в магазине, где терминал установлен в зоне кассира и перенести его можно только вместе с кассиром. Согласен, так себе вариант. Тогда переходим на следующий этап.

Меняем SIM-карту. Пробуем сим карты разных операторов сотовой связи, пока не найдем оптимальный вариант по качеству связи. Помучиться придется недолго, — вариантов у вас не особо много. Если что, у нас есть бесплатные сим карты МТС, вдруг подойдет.

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

Подключаем проводной интернет. Если в POS-терминале есть стандартный порт Ethernet для подключения интернет-кабеля, но сам проводной интернет в помещении не проведен, то покупаем роутер с USB разъемом, подключаем в него 4G модем (тоже придется докупить) любого оператора сотовой связи и подключаем терминал кабелем к роутеру. Метод рабочий и спасал не один раз. Только убедитесь, что сигнал 3G/4G выбранного оператора стабильно ловит в месте установки терминала, а то скажете, что не предупреждали.

Покупаем POS-терминал с 3G модулем. Если все предыдущие варианты не помогли или было лень делать, то просто сразу покупаем POS-терминал с встроенным 3G модулем и радуемся жизни. Ширина канала 3G больше и обеспечивает стабильную передачу данных на более высоких скоростях, чем GPRS 2G (GSM). Опять же, — сначала убедитесь, что связь 3G хорошо «ловит» в месте установки POS-терминала. Метод рабочий, но придется раскошелиться.

Вариант с роутером и 4G модемом часто выходит дешевле, если говорить о стационарных POS-терминалах. Если терминал переносной, то вариантов немного, — надеяться, что GPRS 2G (GSM) будет хорошо «ловить» или сразу доплатить и купить терминал с 3G. Кстати, может слышали такую поговорку: «Лучший способ не расстраиваться — это не надеяться».

***

Минуточку! А где вариант, что POS-терминал плохо работает или вообще сломался и поэтому часто выходит ошибка сессии SSL? Конечно же спросите вы. Не спорю, такой вариант возможен. Только вот если в терминале вышел из строя GPRS/GSM/3G модуль, то связи не будет вообще никакой, терминал даже сим карту не увидит. А ошибка сессии SSL как бы намекает нам, что данные переданы и получены, но не все — из-за обрыва связи.

Еще иногда помогает перезагрузка POS-терминала. Но это скорее временное решение проблемы. Расширить или освободить канал связи перезагрузка не поможет.

На этом вроде бы все. Благодарю за внимание. Если есть вопросы, — пишите в комментариях, обсудим.


Успехов в вашем бизнесе!

Доброго времени господа знатоки) такая проблема поставила меня в тупик — делал я много сайтов на всех использовал один и тот же скрипт запуска и записи данных в сессии а именно

 <?php
 session_start();
 ?>

так запускаю — документ сохранен в ютф- без бом(!) — все как полагается сессия запускается в сааааамом начале документа — перед функцией запуска нету ни одного символа тут все по фэншую

записываю в сессию вот так

  $_SESSION['passw'] = "паролль к примеру"; 
  $_SESSION['login'] = "ну логин к примеру"; 

проверяю допустим так

  if (!empty($_SESSION['login']) && !empty($_SESSION['passw'])) {  }

и не работает( при том — на локальном хосте — все работает идеально — на 20ти других сайтов работает тоже один и тот же этот скрипт!

замечу что этот сайт на котором не работает сей простой скрипт — находится на совершенно другом хостинге чем те 10 сайтов на которых все работает (не говорю уже об ЛХ) хостинг панель rshost (если это поможет) предоставлен видимо ISPsystem © 1997-2015 (в копирайте написано) я в начале думал что просто в тупую на хосте отключены сессии НО до этого на хосте стоял старый сайт на джумле и там все было настроено через сессии и все вроде как работало, я в тупике господа подскажите пожалуйста — вдруг кто то с похожим сталкивался?

Забыл возможно это важно!
после того как юзер авторизуется и через пост передаются логин пароль в обработчик (который на этой же странице что и форма) для проверки — после того если проверка прошла и данные заносятся в сессию — страница обновляется
через js так

 ?>
        <script type="text/javascript">
        alert('Поздравляю вы успешно авторизовались!');
        location.href="";
        </script>
        <?php 

что бы очистить переменные POST

Когда вебмастер начинает работать с сессиями, он часто сталкивается с тем, что сессия не сохраняется при переходе на другую страницу. Причин может быть множество, ниже представлен список наиболее распространённых, изучив которые, вы сможете решить проблему.

Почему не сохраняется сессия при переходе на другую страницу?

1. Вы забыли запустить сессию

Пожалуй, это самая распространённая причина почему не сохраняется сессия. Запуск сессии посредством функции session_start(); должен осуществляться на каждой странице, где используется сессия. Лучше всего session_start(); писать сразу после открывающего тега <?php

2. Сессия уничтожается в коде

Прежде чем пропускать этот пункт и идти далее с мыслью «Да ну, бред какой-то, нигде я сессию не уничтожаю.», удостоверьтесь, действительно ли вы нигде не очищаете сессию? Уничтожить сессию можно с помощью функции session_destroy(); или вы можете очистить значения сессии путём следующей конструкции: unset($_SESSION['name']);. Убедитесь, что у вас этого нет.

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

Для начала проверьте куда у вас записывается сессия. Выполните phpinfo(); и посмотрите значение параметра session.save_path. Это и есть директория, куда сохраняется сессия. Зайдите в неё и посмотрите, есть ли там файлы типа "0Thee5g9vsknDhen14kyYt5lv7". Если файлов нет, значит сессия не может сохраниться, посмотрите правильно ли выставлены права доступа к директории.

4. После отправки заголовка не используется exit();

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

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

Убедитесь, что использование cookies разрешено в браузере, в котором используется сайт.

6. Редирект с одного домена на другой

При редиректе с одного домена на другой сессия потеряется. Даже если это один домен и он отличается наличием «www», например при перенаправлении с «site.com» на «www.site.com» сессия пропадёт, убедитесь, что у вас этого не происходит.

7. У вас нет favicon.ico

Пожалуй, самая экзотическая из всех вышеперечисленных причин, почему сессия может не сохранятся. Я не знаю почему так происходит, но если у вас нет favicon’а на сайте, браузер Google Chrome может «потерять» вашу сессию. Это бывает не на всех серверах, подобный глюк я обнаружил на nginx’е.

Понравилась статья? Поделить с друзьями:
  • Как это составить план стихотворения
  • Как найти все драйвера для своего компьютера
  • Как найти отчеты в авто ру
  • The game malfunctioned total war britannia как исправить
  • Как найти сопряжение физика