Переменные сеанса PHP не обслуживаются - PullRequest
3 голосов
/ 05 декабря 2010

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

Похоже, что файлы 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){}

Может кто-нибудь помочь мне найти решение этой проблемы?

ОБНОВЛЕНИЕ - настройки 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 

ОБНОВЛЕНИЕ - Решение

Поскольку мое приложение использовало фреймы, извлекающие страницы из другого домена (который я создал), файлы cookie, которые я пытался установить, блокировались. Установите заголовок P3P, и проблема, кажется, решена!

Ответы [ 6 ]

3 голосов
/ 05 декабря 2010

Мое предложение от ваш предыдущий вопрос все еще остается в силе: пожалуйста, сравните идентификаторы сессии.

Решение может быть таким же простым, как если бы ваш браузер не принимал сеансовые куки.

Вы получаете идентификатор сеанса, вызывая session_id(). Сделайте это сразу после session_start(), это должно дать вам постоянное значение , если сеанс такой же. В противном случае для каждого запроса создается новый сеанс.

Также проверьте C:\wamp\tmp. Файлы gazillion в этом каталоге могут указывать новые сеансы для каждого запроса.

РЕДАКТИРОВАТЬ Поскольку мы подтвердили новые сеансы для каждого запроса, пришло время выяснить, принимаются ли сеансовые файлы cookie. Проверьте настройки вашего браузера и убедитесь, что файл cookie для вашего домена (я думаю, это «localhost») с именем PHPSESSID можно найти.

3 голосов
/ 05 декабря 2010

Вы вызываете session_start() на каждой странице, которая обращается к данным сеанса?

Редактировать: И вы получаете один и тот же идентификатор сессии каждый раз?
Кроме того, может быть какая-то ошибка или предупреждение, которое вы пропускаете (например, заголовки уже отправлены) из-за настроек?

1 голос
/ 05 декабря 2010

Просмотрите настройки вашего сеанса.У вас есть полный список:

<?php

phpinfo();

?>

Прокрутите вниз до таблицы «Сеанс».

В частности, убедитесь, что каталог session.save_path существует и доступен для записи.

1 голос
/ 05 декабря 2010

здесь смысл в

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))
{
  $_SESSION['saveddata'] = $row;
}

переписывает значение $_SESSION['saveddata'] на каждой итерации. может быть, вы имели в виду что-то вроде

 $_SESSION['saveddata'][] = $row;

имеет смысл для $atid = $_SESSION['saveddata']['autotaskid'];

0 голосов
/ 04 августа 2018

Я решил эту проблему на локальном WAMP, очистив каталог \ tmp от старых сессий.

0 голосов
/ 30 ноября 2016

Когда новый идентификатор сеанса создается с каждым запросом, скорее всего, это проблема с путями вашего сеанса (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

...