Данные сеанса 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>';
?>

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

Вот phpinfo () для моего хост-сервера (PHP версии 4.4.7): Данные сеанса PHP не сохраняются

Попробуйте заменить строку echo '<p> <a href="page1.php"> Обновить </a> </p>'; с заголовком ('Location: http: //'.$_SERVER [' HTTP_HOST '] .'page1.php');

Nikita Yo LAHOLA 29.04.2015 01:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
57
1
110 054
22
Перейти к ответу Данный вопрос помечен как решенный

Ответы 22

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

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

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

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

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

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

Спасибо! Моя проблема заключалась в том, что файлы cookie не сохранялись правильно, что приводило к потере всех переменных сеанса между страницами. Зафиксированный!

tozhan 16.08.2015 12:26

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

if (isset($_SESSION['views'])) {
    if (!is_numeric($_SESSION['views'])) {
        echo "CRAP!";
    }
    ++$_SESSION['views'];
} else {
    $_SESSION['views'] = 1;
}

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

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

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

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

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

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

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

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

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

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

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

Ответ принят как подходящий

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

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

I know one solution I found (OSX with Apache 1 and just switched to PHP5) when I had a similar problem was that unsetting 1 specific key (ie unset($_SESSION['key']);) was causing it not to save. As soon as I didn't unset that key any more it saved. I have never seen this again, except on that server on another site, but then it was a different variable. Neither were anything special.

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

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

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

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

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

Это была моя проблема - и я сам установил session.cookie_secure - да! Странно то, что он проработал в небезопасной среде около 2 недель, прежде чем внезапно остановился - поэтому я не подумал связать их.

muz the axe 26.08.2016 01:08

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

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

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

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

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

Проблема / a в том, что ваш заголовок не будет перенаправлять из-за отсутствия пространства между location и index2.phpheader('location:index2.php'); <= не будет работать, но это будет => header('location: index2.php');

Funk Forty Niner 07.09.2013 18:29

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

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

Распространенной проблемой, о которой часто забывают, также является то, что перед командой session_start () НЕ ДОЛЖНО быть НИКАКОГО другого кода или лишних пробелов.

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

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

session.gc_probability=0

Добавление моего решения:

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

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

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

Действительно, при использовании example.net мой браузер не сохранял cookie сеанса. С example.net все заработало. Но как имя хоста может иметь значение?

xebeche 13.07.2017 18:05

У каждого поддомена есть своя временная папка для сессий. www также считается поддоменом.

Avatar 13.07.2017 18:11

В моем случае приложение всегда отправляло один и тот же заголовок Set-Cookie с domain=www.example.net, но Firefox молча (я искал способ записать это через 2 часа) отбрасывал cookie, если доступ к сайту осуществлялся как example.net. Изменение приложения так, чтобы оно отправляло domain=example.net, исправило это. Кстати, на сервере это было вызвано UseCanonicalName On в сочетании с ServerName www.example.net.

xebeche 14.07.2017 19:21

Еще несколько вещей, которые мне пришлось сделать (у меня была такая же проблема: нет сохранения сессий после обновления 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 (includes / classes и includes / functions) со слегка измененным application_top.php, чтобы все снова заработало. Основной проблемой были настройки php.ini, но это, конечно, зависит от того, что ваша серверная компания установила по умолчанию.

Другие вопросы по теме