У меня одна из тех ситуаций «клянусь, я не трогал сервер». Я честно не трогал ни один из скриптов 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):







Используйте phpinfo() и проверьте настройки session.*.
Возможно, информация хранится в файлах cookie, и ваш браузер не принимает файлы cookie или что-то в этом роде.
Сначала проверьте это и вернитесь с результатами.
Вы также можете сделать print_r($_SESSION);, чтобы получить дамп этой переменной и просмотреть содержимое ....
Что касается вашего phpinfo(), является ли session.save_path действующим? Есть ли у вашего веб-сервера доступ для записи в этот каталог?
Надеюсь это поможет.
Спасибо! Моя проблема заключалась в том, что файлы cookie не сохранялись правильно, что приводило к потере всех переменных сеанса между страницами. Зафиксированный!
Проверяйте значение «просмотров», прежде чем увеличивать его. Если по какой-то странной причине он устанавливается в строку, то когда вы добавляете к нему 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).
Вот что нужно проверить:
Вы где-нибудь вызываете session_unset () или session_destroy ()? Эти функции немедленно удаляют данные сеанса. Если я помещу их в конец сценария, он начнет вести себя точно так, как вы описываете.
Во всех ли браузерах он действует одинаково? Если он работает в одном браузере, а не в другом, у вас могут быть проблемы с настройкой в неработающем браузере (т. Е. Вы отключили файлы cookie и забыли их включить или по ошибке заблокировали файлы cookie).
Доступна ли запись в папку сеанса? Вы не можете проверить это с помощью 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 недель, прежде чем внезапно остановился - поэтому я не подумал связать их.
Я потратил целую вечность на поиски решения аналогичной проблемы. Это не было проблемой с кодом или настройкой, так как очень похожий код отлично работал в другом .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');
Убедитесь, что вы не смешиваете 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 все заработало. Но как имя хоста может иметь значение?
У каждого поддомена есть своя временная папка для сессий. www также считается поддоменом.
В моем случае приложение всегда отправляло один и тот же заголовок Set-Cookie с domain=www.example.net, но Firefox молча (я искал способ записать это через 2 часа) отбрасывал cookie, если доступ к сайту осуществлялся как example.net. Изменение приложения так, чтобы оно отправляло domain=example.net, исправило это. Кстати, на сервере это было вызвано UseCanonicalName On в сочетании с ServerName www.example.net.
Еще несколько вещей, которые мне пришлось сделать (у меня была такая же проблема: нет сохранения сессий после обновления 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, но это, конечно, зависит от того, что ваша серверная компания установила по умолчанию.
Попробуйте заменить строку echo '<p> <a href="page1.php"> Обновить </a> </p>'; с заголовком ('Location: http: //'.$_SERVER [' HTTP_HOST '] .'page1.php');