Вопрос

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

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

<?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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

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

У меня возникла следующая проблема

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

session.gc_probability=0

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top