Данные сеанса PHP не сохраняются - PullRequest
56 голосов
/ 01 октября 2008

У меня одна из тех ситуаций "клянусь, я не трогал сервер". Я, честно говоря, не трогал ни один из скриптов php. Проблема у меня заключается в том, что данные php не сохраняются на разных страницах или обновления страниц. Я знаю, что новый сеанс создается правильно, потому что я могу установить переменную сеанса (например, $ _SESSION ['foo'] = "foo" и распечатать его обратно на той же странице просто отлично. Но когда я пытаюсь использовать эту же переменную на другой странице это не задано! Есть ли какие-либо функции или информация php, которые я могу использовать на своем хост-сервере, чтобы увидеть, что происходит?

Вот пример сценария, который на данный момент не работает на сервере моих хостов:

<?php
session_start();
if(isset($_SESSION['views']))
    $_SESSION['views'] = $_SESSION['views']+ 1;
else
    $_SESSION['views'] = 1;

echo "views = ". $_SESSION['views'];
echo '<p><a href="page1.php">Refresh</a></p>';
?>

Переменная 'views' никогда не увеличивается после обновления страницы. Я думаю, что это проблема с их стороны, но я хотел убедиться, что сначала я не полный идиот.

Вот phpinfo () для сервера моих хостов (версия PHP 4.4.7): alt text

Ответы [ 22 ]

41 голосов
/ 02 октября 2008

Спасибо за всю полезную информацию. Оказывается, мой хост изменил серверы и начал использовать другой путь сохранения сеанса, отличный от / var / php_sessions, который больше не существует. Решением было бы объявить ini_set(' session.save_path','SOME WRITABLE PATH'); во всех моих файлах скриптов, но это было бы больно. Я разговаривал с хостом, и они явно установили путь сеанса к реальному пути, который действительно существовал. Надеюсь, что это поможет любому, у кого проблемы с сеансом.

12 голосов
/ 25 октября 2011

Убедитесь, что вы не смешиваете https: // с http: //. Переменные сеанса не передаются между безопасными и незащищенными сеансами.

9 голосов
/ 11 октября 2010

Была такая же проблема - что случилось со мной, наш администратор сервера изменил логическое значение session.cookie_secure на On, что означает, что куки будут отправляться только через безопасное соединение Поскольку cookie не был найден, php каждый раз создавал новый сеанс, поэтому переменные сеанса не были видны.

7 голосов
/ 01 октября 2008

Используйте phpinfo() и проверьте настройки session.*.

Возможно, информация хранится в файлах cookie, и ваш браузер не принимает файлы cookie, что-то в этом роде.

Сначала проверьте это и вернитесь с результатами.

Вы также можете сделать print_r($_SESSION);, чтобы получить дамп этой переменной и просмотреть содержимое ....

Относительно вашего phpinfo(), является ли session.save_path действительным? Есть ли у вашего веб-сервера доступ на запись в этот каталог?

Надеюсь, это поможет.

6 голосов
/ 21 июля 2011

У меня была следующая проблема

index.php

<?
    session_start();
    $_SESSION['a'] = 123;
    header('location:index2.php');
?>

index2.php

<?
  session_start();
  echo $_SESSION['a'];
?>

Переменная $_SESSION['a'] установлена ​​неправильно. Затем я изменил index.php соответственно

<?
    session_start();
    $_SESSION['a'] = 123;
    session_write_close();
    header('location:index2.php');
?>

Я не знаю, что это внутренне означает, я просто объясняю себе, что изменение переменной сеанса было недостаточно быстрым

5 голосов
/ 01 октября 2008

Проверьте, доступен ли для записи путь сохранения сеанса веб-сервер.

Убедитесь, что у вас включены файлы cookie .. (Я забываю, когда выключаю их, чтобы что-то проверить)

Используйте firefox с расширением firebug, чтобы увидеть, был ли файл cookie установлен и передан обратно.

И на несвязанной ноте начните смотреть на php5, потому что php 4.4.9 является последним из серии php4.

3 голосов
/ 11 апреля 2010

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

2 голосов
/ 01 октября 2008

Что ж, мы можем устранить ошибку кода, потому что я тестировал код на своем собственном сервере (PHP 5).

Вот что нужно проверить:

  1. Вы вызываете session_unset () или session_destroy () где-нибудь? Эти функции немедленно удаляют данные сеанса. Если я добавлю их в конец моего сценария, он начнет вести себя так, как вы описали.

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

  3. Доступна ли для записи папка сеанса? Вы не можете проверить это с помощью is_writable (), поэтому вам нужно перейти в папку (из phpinfo () она выглядит как / var / php_sessions) и убедиться, что сессии действительно создаются.

2 голосов
/ 01 октября 2008

Проверьте значение «views», когда перед этим вы увеличиваете его. Если по какой-то странной причине он получает строку, то при добавлении к ней 1 он всегда возвращает 1.

if (isset($_SESSION['views'])) {
    if (!is_numeric($_SESSION['views'])) {
        echo "CRAP!";
    }
    ++$_SESSION['views'];
} else {
    $_SESSION['views'] = 1;
}
2 голосов
/ 21 июня 2011

Я целую вечность искал ответ на подобную проблему. Это не было проблемой с кодом или настройкой, так как очень похожий код отлично работал в другом .php на том же сервере. Оказалось, что проблема была вызвана очень большим объемом данных, сохраняемых в сеансе на этой странице. В одном месте у нас была такая строка: $_SESSION['full_list'] = $full_list, где $full_list - массив данных, загруженных из базы данных; каждая строка представляла собой массив из 150 элементов. Когда код был изначально написан пару лет назад, БД содержала только около 1000 строк, поэтому $full_list содержал около 100 элементов, каждый из которых представлял собой массив из около 20 элементов. Со временем 20 элементов превратились в 150, а 1000 строк превратились в 17000, поэтому код сохранял в сеансе около 64 мегабайт данных. По-видимому, с таким количеством хранимых данных он отказывался хранить что-либо еще. Как только мы изменили код, чтобы обрабатывать данные локально, не сохраняя их в сеансе, все работало отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...