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


У меня одна из тех ситуаций "Клянусь, я не прикасался к серверу". Честно говоря, я не трогал ни один из 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>';
?>

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

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

 55
Author: Ilmari Karonen, 2008-10-01

22 answers

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

 41
Author: Crackerjack, 2008-10-01 21:57:04

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

 12
Author: paul, 2011-10-25 01:38:28

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

 9
Author: Shane N, 2010-10-11 16:16:45

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

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

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

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

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

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

 7
Author: vIceBerg, 2017-08-10 06:30:22

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

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');
?>

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

 6
Author: harry, 2015-05-30 07:52:32

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

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

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

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

 5
Author: DGM, 2008-10-01 02:23:22

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

 3
Author: buzzy blogger, 2010-04-11 09:15:41

Проверьте значение "просмотров", прежде чем увеличивать его. Если по какой-то странной причине он устанавливается в строку, то при добавлении к нему 1 он всегда будет возвращать 1.

if (isset($_SESSION['views'])) {
    if (!is_numeric($_SESSION['views'])) {
        echo "CRAP!";
    }
    ++$_SESSION['views'];
} else {
    $_SESSION['views'] = 1;
}
 2
Author: nickf, 2008-10-01 02:06:09

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

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

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

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

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

 2
Author: Nathan Strong, 2008-10-01 04:36:39

Если вы установили сеанс в php5, а затем попытаетесь прочитать его на странице php4, он может выглядеть не в том месте! Сделайте страницы одинаковой версией php или задайте путь к сеансу.

 2
Author: Harry, 2010-04-10 14:50:58

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

 2
Author: Aleks G, 2011-06-21 16:32:33

Я знаю одно решение, которое я нашел (OSX с Apache 1 и только что переключился на PHP5), когда у меня была аналогичная проблема, заключавшаяся в том, что сброс 1 определенного ключа (т.Е. Сброс ($_SESSION['ключ']);) приводил к тому, что он не сохранялся. Как только я больше не снимал этот ключ, он сохранялся. Я никогда больше не видел этого, кроме как на том сервере на другом сайте, но тогда это была другая переменная. Ни в том, ни в другом не было ничего особенного.

Спасибо за это, Дэррил. Это мне помогло. Я удалял сеанс переменная, и по какой-то причине она удерживала сеанс от фиксации. теперь я просто устанавливаю для него значение null (что хорошо для моего приложения), и это работает.

 2
Author: nhahtdh, 2012-08-14 16:07:42

Я знаю одно решение, которое я нашел (OSX с Apache 1 и только что переключился на PHP5), когда у меня была аналогичная проблема, заключавшаяся в том, что сброс 1 определенного ключа (т.Е. Сброс ($_SESSION['ключ']);) приводил к тому, что он не сохранялся. Как только я больше не снимал этот ключ, он сохранялся. Я никогда больше не видел этого, кроме как на том сервере на другом сайте, но тогда это была другая переменная. Ни в том, ни в другом не было ничего особенного.

 1
Author: Darryl Hein, 2008-10-01 05:52:31

Вот одна распространенная проблема, которую я не видел в других комментариях: на вашем хосте работает какой-то кэш? Если они автоматически кэшируют результаты каким-либо образом, вы получите такое поведение.

 1
Author: Stuart, 2008-10-01 07:18:27

Просто хотел добавить небольшое примечание, что это также может произойти, если вы случайно пропустите оператор session_start() на своих страницах.

 1
Author: , 2009-05-31 14:11:38

У меня был путь к файлу cookie сеанса, установленный на "//" вместо "/". Огненный жук - это потрясающе. Надеюсь, это кому-нибудь поможет.

 1
Author: Slawa, 2011-07-12 14:13:42

У меня была эта проблема при использовании защищенных страниц, откуда я пришел www.domain.com/auth.php это перенаправлено на domain.com/destpage.php . Я удалил www из auth.php ссылка, и это сработало. Это сбило меня с толку, потому что все работало иначе; сеанс не был установлен, когда я прибыл в пункт назначения.

 1
Author: Sean Anderson, 2012-01-12 18:02:03

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

У меня уже была эта проблема раньше, когда у меня была пустая строка перед session_start(), из-за чего она не работала должным образом.

 1
Author: hyarion, 2012-06-20 10:58:26

Добавляю свое решение:

Проверьте, имеете ли вы доступ к правильному домену . Я использовал www.mysite.com для запуска сеанса и попытался получить его от mysite.com (без www).

Я решил эту проблему, добавив перезапись htaccess всех доменов в www, чтобы быть в безопасности/на сайте.

Также проверьте, используете ли вы http или https.

 1
Author: Kai Noack, 2014-10-03 14:35:50

Отредактируйте свой php.ini.
Я думаю, что значение session.gc_probability равно 1, поэтому установите его равным 0.

session.gc_probability=0
 1
Author: emaniacs, 2018-01-16 04:09:40

Проверьте, используете ли вы session_write_close(); в любом случае, я использовал это сразу после другого сеанса, а затем снова попытался записать в сеанс, и это не сработало.. так что просто прокомментируйте это дерьмо

 0
Author: , 2009-07-31 11:43:56

Еще несколько вещей, которые мне нужно было сделать (у меня была та же проблема: отсутствие сохранения sesson после обновления PHP до версии 5.4). Вам это может не понадобиться, в зависимости от того, что содержит php.ini вашего сервера (проверьте phpinfio());

session.use_trans_sid=0 ; Do not add session id to URI (osc does this)
session.use_cookies=0;  ; ensure cookies are not used
session.use_only_cookies=0 ; ensure sessions are OK to use IMPORTANT
session.save_path=~/tmp/osc; ; Set to same as admin setting
session.auto_start = off; Tell PHP not to start sessions, osc code will do this

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

Вам также может потребоваться изменить несколько фрагментов кода сеанса в application_top.php - создание объектов, которых нет в вызовы tep_session_is_registered(...) (например. объект навигации), установите переменные $HTTP_ в более новые переменные $_SERVER и несколько других тестов isset для пустых объектов (google для информации). В итоге я смог использовать оригинал sessions.php файлы (включает в себя/классы и включает в себя/функции) со слегка измененным application_top.php чтобы все снова пошло своим чередом. Настройки php.ini были основной проблемой, но это, конечно, зависит от того, что ваша серверная компания установила по умолчанию.

 0
Author: Pete855217, 2014-10-04 10:29:04