У меня есть приложение, которое работает с переменными сеанса без проблем. Я начинаю сеанс перед заголовками на каждой странице, которая использует, когда это было хорошо, тогда неожиданно я получаю неопределенную ошибку индекса при переходе на страницу, отличную от той, которая устанавливает переменные сеанса. Но только на некоторых браузерах . Иногда сеансы поддерживаются, а иногда и нет.
Похоже, что файлы cookie не хранятся некоторое время. Я делал проверки с использованием разных браузеров, и иногда файлы cookie хранятся, а иногда нет.
Я сделал эксперимент. Я использовал Firefox для использования в приложении, и я следил за папкой tmp, где хранятся сеансы. Я очистил его. Используя firefox, я начал использовать приложение, используя все страницы, на которых были заняты сеансы, и в конце я проверил папку tmp, и там был один файл сеанса.
То же самое было с Internet Explorer, и теперь есть 7 разных файлов сеансов.
Я использую PHP 5.3.0 со стеком WAMP. Apache 2.2.11. Поддержка сеанса включена в моем phpinfo ().
Я вызываю дамп var на первой странице и распечатывает данные сеанса. На любых последующих страницах переменная сеанса пуста.
<?php var_dump($_SESSION); ?> array(0){}
Может ли кто-нибудь помочь мне разобраться с решением?
UPDATE – настройки PHP INI SESSION
Directive Local Value Master Value session.auto_start Off Off session.bug_compat_42 On On session.bug_compat_warn On On session.cache_expire 180 180 session.cache_limiter nocache nocache session.cookie_domain 82.68.26.169 82.68.26.169 session.cookie_httponly Off Off session.cookie_lifetime 0 0 session.cookie_path / / session.cookie_secure Off Off session.entropy_file no value no value session.entropy_length 0 0 session.gc_divisor 1000 1000 session.gc_maxlifetime 1440 1440 session.gc_probability 1 1 session.hash_bits_per_character 5 5 session.hash_function 0 0 session.name PHPSESSID PHPSESSID session.referer_check no value no value session.save_handler files files session.save_path c:/wamp/tmp c:/wamp/tmp session.serialize_handler php php session.use_cookies On On session.use_only_cookies On On session.use_trans_sid 0 0
ОБНОВЛЕНИЕ – Решение
Поскольку мое приложение использовало iframe, который вытаскивал страницы из другого домена (который я создал), файлы cookie, которые я пытался установить, блокировались. Настройте заголовок P3P, и проблема, похоже, решена!
Мое предложение из вашего предыдущего вопроса все еще стоит: пожалуйста, сравните идентификаторы сеанса.
Решение может быть таким же простым, как ваш браузер не принимает cookie сеанса.
Вы получаете идентификатор сеанса, вызывая session_id()
. Сделайте это сразу после session_start()
он должен дать вам постоянное значение, если сеанс тот же. В противном случае для каждого запроса создается новый сеанс.
Также проверьте C:\wamp\tmp
. Файлы gazillion в этом каталоге могут указывать свежие сеансы для каждого запроса.
EDIT. Поскольку мы подтвердили новые сеансы для каждого запроса, пришло время выяснить, принимаются ли cookie сеанса. Проверьте настройки своего браузера и подтвердите, что файл cookie для вашего домена (я думаю, это «localhost») с именем PHPSESSID
можно найти.
Вы вызываете session_start()
на каждой странице, которая обращается к данным сеанса?
Изменить: И вы получаете один и тот же идентификатор сеанса каждый раз?
Кроме того, может быть некоторая ошибка или предупреждение, которые вам не хватает (например, уже отправленные заголовки) из-за настроек?
здесь смысл в
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)) { $_SESSION['saveddata'] = $row; }
он перезаписывает значение $_SESSION['saveddata']
на каждой итерации. может быть, вы имели в виду что-то вроде
$_SESSION['saveddata'][] = $row;
это имеет смысл для $atid = $_SESSION['saveddata']['autotaskid'];
Просмотрите настройки сеанса. У вас есть полный список:
<?php phpinfo(); ?>
Прокрутите вниз до таблицы «Сессия».
В частности, убедитесь, что каталог session.save_path
существует и доступен для записи.
Когда с каждым запросом создается новый идентификатор сеанса, скорее всего это проблема с вашими путями сеансов (save_path и cookie_path), и шансы на это больше, если вы размещаете разные приложения на одном сервере (общий хостинг), а некоторые из них эти приложения также выполняют сеансы. Это приводит к конфликтам в вашем каталоге / tmp. Вы можете изменить конфигурацию своего ini-файла, но лучше всего настроить эти параметры во время выполнения.
session_set_cookie_params(0, "/app", ".domain.com");//set session cookie parameters session_save_path("/home/../public_html/app/sess");//set directory of this app's session data session_start();//start session
Надеюсь, это поможет всем, у кого есть эта проблема. #CodeOn