View previous topic :: View next topic |
Author |
Message |
jodaka Tux's lil' helper
Joined: 16 May 2004 Posts: 129 Location: Russia, Togliatty
|
Posted: Sat Mar 05, 2005 1:27 pm Post subject: проблема с сессиями в PHP |
|
|
стоят свежеустановленные apache2 2.0.52 и php 4.3.10.
создаем файл:
Code: | <?
session_start();
$_SESSION['yo'] = '111';
?> |
запускаем в броузере и видим:
Code: | Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home/www/kc/www/jod/index2.php:1) in /home/www/kc/www/jod/index2.php on line 2 |
при этом файл с сессией в /tmp создается и в нем записано значение переменной yo.
Не пойму пока кто виноват, но прикол в том, что HTTP заголовки отправляются сразу, как только в файле встречается "<?"
это я определил, воспользовавшись headers_sent в пхп. Это видно на примере:
Code: | <?
if (!headers_sent($fname, $lnum)) {
session_start();
} else {
trigger_error("Невозможно начать сессию, HTTP заголовок уже отправлен файлом $fname, на строке $lnum");
}
?>
|
запускаем и в броузере видим:
Code: |
Notice: Невозможно начать сессию, HTTP заголовок уже отправлен файлом /home/www/kc/www/jod/index2.php, на строке 1 in /home/www/kc/www/jod/index2.php on line 6 |
вот настройки php:
Code: |
Session Support enabled
Registered save handlers files user
Directive Local Value Master Value
session.auto_start Off Off
session.bug_compat_42 On On
session.bug_compat_warn On On
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_lifetime 0 0
session.cookie_path /tmp /tmp
session.cookie_secure Off Off
session.entropy_file no value no value
session.entropy_length 0 0
session.gc_divisor 100 100
session.gc_maxlifetime 1440 1440
session.gc_probability 1 1
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path /tmp /tmp
session.serialize_handler php php
session.use_cookies Off Off
session.use_only_cookies Off Off
session.use_trans_sid Off Off
|
замечу, что проект, который я сейчас пытаюсь запустить успешно протестирован на старом альт линуксе с древним пхп и апачем, а также под виндой.
помогите пожалуйста настроить пхп/апач. |
|
Back to top |
|
|
Ubnormal n00b
Joined: 20 Aug 2004 Posts: 17
|
Posted: Sat Mar 05, 2005 3:49 pm Post subject: |
|
|
Ну для начала полезно RTFM =)
Например тут: http://php.net/session
А вообще обрати внимание на переменные session.use_cookies у тебя эта возможность выключена вообще - т.е. идентификатор сессии впринципе не шлется клиенту(напомню что слать идентификатор сессии в куки это общепринятая и наиболее безопасная практика)
Далее даже если бы вышеуказанная опция была бы включена, то скорее всего у тебя бы ничего не работало потому что неверно задана переменная:
session.cookie_path /tmp /tmp
ты видимо неправильно понял значение этого параметра - это путь из которого разрешен доступ к куки клиенту. Т.е если у тебя сайт http://pupkin.ru то скрипты сайта смогут получить значение куки только если они находятся ниже относительно http://pupkin.ru/tmp/ Читай спецификацию куки.
Далее смотрим строку:
session.use_trans_sid Off Off
это говорит о том что ты запретил для PHP возможность передавать идентификатор сессии напрямую в ссылках.
Итого:
Всего в PHP зашито 2 механизма передачи идентификатора сессий - через куки и напрямую в ссылках, оба механизма у тебя отключены. Т.е. номинально механизм сессии есть и пытается что-то делать - как ты говоришь он сохраняет данные сессии и все такое, но фактически сессия не работает потому что ее идентификатор никаким образом не передается клиенту.
Рекомендация:
включи session.use_cookies
поправь session.cookie_path c "/tmp" на "/"
Всего хорошего смотрите http://ifun.ru =) |
|
Back to top |
|
|
jodaka Tux's lil' helper
Joined: 16 May 2004 Posts: 129 Location: Russia, Togliatty
|
Posted: Sat Mar 05, 2005 6:18 pm Post subject: |
|
|
Quote: | Ну для начала полезно RTFM =) |
поверьте, прежде чем тут спрашивать я пол дня сам пытался проблему решить и все доки просмотрел и весь инет перегуглил
Ubnormal wrote: |
А вообще обрати внимание на переменные session.use_cookies у тебя эта возможность выключена вообще - т.е. идентификатор сессии впринципе не шлется клиенту(напомню что слать идентификатор сессии в куки это общепринятая и наиболее безопасная практика)
|
либо через урл. Хотя у меня в настройках всё было выключено. Я пол дня экспериментировал с настройками и ничего не помогает.
Однако вы не увидели сути вопроса.
Посмотрите на кусок кода, где есть headers_sent
проблема даже не с сессиями (я уже описал, что сессии создаются и переменные в них сохраняются), проблема в том, что HTTP заголовки шлются СРАЗУ, как только пхп парсер встречает "<?"
Ubnormal wrote: |
включи session.use_cookies
поправь session.cookie_path c "/tmp" на "/"
|
они по умолчанию так и были, я их в процессе экспериментов менял, но проблема явно не здесь кроется.
проблема в слишком рано посланных заголовках |
|
Back to top |
|
|
Ubnormal n00b
Joined: 20 Aug 2004 Posts: 17
|
Posted: Sat Mar 05, 2005 7:08 pm Post subject: |
|
|
Проблему я понял прекрасно, просто сразу увидел нелепый конфиг и взялся за перо =) Видимо вы решили пойти от обратного, создав заведомо нерабочую конфигурацию =)
Единственное, что мне приходит в голову глядя на конфиг стандартный конфиг ПХП так это то что у вас возможно в php.ini стоит:
implicit_flush=On
потому как ничего другого похоже не может вызвать такое развитие событий, либо у вас какая-то эксклюзивная версия PHP =)
В случае implicit_flush=On рекомендую исправить на Off если нет, тогда рекомендую найти php.ini-recomended взять за основу и поменьше извращаться.
У меня сработало примерно следующее:
USE="bla bla bla" emerge apache2
USE="bla bla bla" emerge php5 |
|
Back to top |
|
|
YD Guru
Joined: 30 Oct 2004 Posts: 466 Location: Riga, Latvia
|
Posted: Sun Mar 06, 2005 3:02 am Post subject: |
|
|
До <?php случаем нету пробелов или переноса строк, и т.п.? Если "<" не первой символ(даже не первый непечатуемый) в файле, то в этом причина. |
|
Back to top |
|
|
jodaka Tux's lil' helper
Joined: 16 May 2004 Posts: 129 Location: Russia, Togliatty
|
Posted: Sun Mar 06, 2005 2:36 pm Post subject: |
|
|
Ubnormal wrote: | Проблему я понял прекрасно, просто сразу увидел нелепый конфиг и взялся за перо =) Видимо вы решили пойти от обратного, создав заведомо нерабочую конфигурацию =) |
блин, ну я же писал, что конфигурация изначально была явно рабочая и проблема не в настроках пхп. И даже то, что я эту конфигурацию неслабо извратил не позволяет ни пхп ни апачу посылать заголовки раньше времени.
Ubnormal wrote: |
Единственное, что мне приходит в голову глядя на конфиг стандартный конфиг ПХП так это то что у вас возможно в php.ini стоит:
implicit_flush=On
|
стандартно off и я ничего не трогал
Ubnormal wrote: |
USE="bla bla bla" emerge apache2
USE="bla bla bla" emerge php5 |
вчера перепробовал разные версии и апачей и пхп и докопался до истины.
проблема оказалась в кодировке файла. У меня локаль UTF8. Если создать файл в другой кодировке - всё ок, в UTF-8 - косяк. Где ковырять настройки UTF ?
P.S. не знаю, важно это или нет, но по дефолту у меня апач отдает документы именно в UTF8 |
|
Back to top |
|
|
Ubnormal n00b
Joined: 20 Aug 2004 Posts: 17
|
Posted: Sun Mar 06, 2005 3:19 pm Post subject: |
|
|
jodaka wrote: |
вчера перепробовал разные версии и апачей и пхп и докопался до истины.
проблема оказалась в кодировке файла. У меня локаль UTF8. Если создать файл в другой кодировке - всё ок, в UTF-8 - косяк. Где ковырять настройки UTF ?
P.S. не знаю, важно это или нет, но по дефолту у меня апач отдает документы именно в UTF8 |
Очень странно.... У меня локаль тоже UTF-8 Apache2 и PHP5 и куча исходников PHP набрана именно в UTF-8 и никогда никаких проблем не было. Рискну предположить что юникод здесь абсолютно не при чем это и ни коим образом не должен влиять на порядок отсыла заголовков. Единственное что вызывает подозрения так это тот факт, что любой юникодный текст если я не ошибаюсь начинается с пары каких-то юникодных козявок. Соответственно, если интерпретатор пхп каким-то образом решит, что кодировка файла не юникод, вполне возможна ситуация, что он эти козявки отправит клиенту =) И тогда при отключенной буферизации(кстати думаю твой случай) - пиши пропало тогда получается, что контент действительно ушел и заголовки слать поздно. Думаю что это твоя ситуация. Думаю что надо копать в сторону системной локали, локали файловой системы и типо того. Давай ка
$ locale
в студию |
|
Back to top |
|
|
jodaka Tux's lil' helper
Joined: 16 May 2004 Posts: 129 Location: Russia, Togliatty
|
Posted: Mon Mar 07, 2005 6:54 am Post subject: |
|
|
Ubnormal wrote: | Давай ка
$ locale
в студию |
Code: | anton@localhost ~ $ locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL= |
на другом форуме порекомендовали использовать "правильные редакторы" у которых есть опция "не писать UTF8 заголовки" :-/ |
|
Back to top |
|
|
Ubnormal n00b
Joined: 20 Aug 2004 Posts: 17
|
Posted: Mon Mar 07, 2005 7:07 am Post subject: |
|
|
Всё я сдаюсь =) Ну если правильный редактор поможет, то мой правильный редактор GVim =))) |
|
Back to top |
|
|
YD Guru
Joined: 30 Oct 2004 Posts: 466 Location: Riga, Latvia
|
Posted: Mon Mar 07, 2005 9:11 pm Post subject: |
|
|
Да, слышал у людей на M$ были траблы с тем, что 2-3 символа вначале, которые тольков HEX editor'e видны. KWrite к примеру нормально работает, когда стоит тип кодировки UTF-8. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|