Подтвердить что ты не робот

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

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

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

<?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 Version 4.4.7): alt text

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

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

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

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

Ответ 5

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

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

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

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

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

Здесь, что нужно проверить:

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

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

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

Ответ 10

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

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

Ответ 11

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

Ответ 12

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

Ответ 13

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

Ответ 14

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

Ответ 15

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

Ответ 16

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

Ответ 17

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

Ответ 18

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

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

Ответ 19

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

session.gc_probability = 0

Ответ 20

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

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

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

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

Ответ 21

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

Ответ 22

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