Переменные сеанса PHP не сохраняются

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

Вот мои файлы:

sess1.php

<?php session_start(); session_register("userid"); session_register("textvar"); $_SESSION['userid'] = 10333 ; $_SESSION['textvar'] = TextVariable ; echo "<p>User ID is: " . $_SESSION['userid'] . "</p>" ; echo "<p>Another variable is: " . $_SESSION['textvar'] . "</p>" ; ?> <p>Go to the <a href="sess2.php">next page</a>.</p> 

и, sess2.php

 <?php session_start(); echo "<p>The userid session variable is: " . $_SESSION['userid'] . "</p>"; echo "<p>The other session variable is: " . $_SESSION['newvar']. "</p> "; ?> 

Вывод браузера в каждом случае:

sess1.php

Идентификатор пользователя: 10333

Другая переменная: TextVariable

Перейдите на страницу [следующая страница].

и, sess2.php

Переменная сеанса userid:

Другая переменная сеанса:

Перейдите к [последней странице].

Несколько вещей это НЕ:

  • У меня есть session_start () в верхней части обоих файлов.
  • Каталог переменных доступен для записи, и там отображаются переменные сеанса. (У меня около сотни небольших файлов, называемых sess_b62, которые есть внутри: 'userid | i: 10333; textvar | s: 12: "TextVariable";'.)
  • phpinfo () сообщает мне, что файл php.ini читается правильно, а время жизни установлено на значение по умолчанию 0, т.е. пока браузер не будет закрыт.

Я в конце своего ума. Какие-либо предложения?

Спасибо.

Идентификатор сеанса связи должен каким-то образом переноситься, чтобы один и тот же сеанс можно было использовать на нескольких страницах. В общем, это делается с помощью cookie (см. session.use_cookies ), но это также можно сделать в URL-адресе или в формах (см. session.use_trans_sid ).

Поэтому сначала вы должны убедиться, что идентификатор сеанса передается так, чтобы PHP мог загружать нужные данные сеанса и сеанса.

См. Также Правильно ли мое понимание PHP-сессий?

session_register() не требуется и может быть причиной проблемы здесь. Прочитайте документы в session_register() – он предназначен для назначения переменных сеанса с использованием существующих переменных.

и отсюда :

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

Я думаю, что это проблема, которую вы испытываете. В конце выполнения скрипта переменная сеанса переписывается.

Я столкнулся с той же проблемой. Причина в том, что в php.ini я установил значение параметра session.cookie_secure равным 1 . Но я использовал http вместо https в URL. Использование https решило проблему.

Установка session.cookie_secure = 1 указывает, что файлы cookie должны отправляться только через защищенные соединения. Таким образом, я получал новые session_ids на каждой новой странице при использовании http.

Одна ошибка, которую я вижу, заключается в том, что в первом файле вы устанавливаете $_SESSION['textvar'] а во втором файле вы вызываете $_SESSION['newvar'] .

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

Я также попытался удалить session_register() и код все еще работает отлично.

«session_register () принимает переменное количество аргументов, любое из которых может быть либо строкой, содержащей имя переменной, либо массив, состоящий из имен переменных или других массивов. Для каждого имени session_register () регистрирует глобальную переменную с этим именем в текущей сессии ».

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

просто используйте $_SESSION[$key] = $value;

Если все вышеперечисленное не решит проблему, я просто спрошу очевидное: не было бы пробелов или новых строк до открытия php-тега?

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

Используйте какой-то инструмент и проверьте заголовки http, чтобы вы могли видеть, как отправляется cookie. Возможно, ваш веб-сервер настроен с ошибкой и отправляет файлы cookie с недопустимым другим доменом.

Возможно, вам захочется посмотреть на session_set_cookie_params () для каждого запроса и убедиться, что установлены правильный домен, путь и т. Д.

Еще одна очевидная вещь, чтобы проверить:

Убедитесь, что ваше дисковое пространство не заполнено; что предотвратит сохранение данных сеанса.

Знайте, что это более старая должность, но у меня была аналогичная проблема (не используя session_register ()).

Требуется преобразовать сеансы в файлы cookie, потому что сеанс слишком часто выходил из строя, и из-за настройки сервера («специальная» среда размещения серверов Windows (с Apache)) значение времени сеанса PHP не может быть изменено.

Конечным результатом было / заключается в том, что теперь, после преобразования в файлы cookie с расширенной продолжительностью жизни, данные cookie все еще теряются (при передаче)? иногда.

Очень расстраивает.

Я НЕ КОГДА-ЛИБО, чтобы это происходило в среде LAMP, поэтому может возникнуть вопрос, следует ли использовать сервер LAMP или нет.

Надеюсь это поможет. Я не думаю, что это проблема PHP.

Проверьте журналы сервера вашего сервера PHP, например nginx или apache.

Вы можете найти информацию о том, почему сеансы не работают в nginx error.log. Обычно путь к этому файлу: /var/log/nginx/error.log .

В моем случае он говорил, что данные сеанса не могут быть сохранены. Оказалось, что в том же каталоге старый файл error.log.1 имел размер 17 ГБ и занимал все свободное место на диске.

Простое освобождение дискового пространства позволило восстановить нормальное поведение сеансов.

Используйте session_register в обоих файлах, и он должен работать.