Переменные сеанса PHP не сохраняются
-
20-08-2019 - |
Вопрос
Я не могу использовать переменные сеанса на странице, отличной от той, на которой они установлены, 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
Другая переменная:Текстовая переменная
Перейдите на [следующую страницу].
и,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 следует отправлять только через защищенные соединения.Поэтому я получал новые идентификаторы сеанса на каждой новой странице при использовании 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.
Информацию о том, почему не работают сеансы, можно найти в файле error.log nginx.Путь к этому файлу обычно следующий: /var/log/nginx/error.log
.
В моем случае говорилось, что данные сеанса не могут быть сохранены.Оказалось, что в том же каталоге старый error.log.1
файл имел размер 17 ГБ и занимал все доступное место на диске.
Простое освобождение дискового пространства восстановило нормальное поведение сессий.
Используйте session_register в оба файлы и все должно работать.