# проблема с сессиями в PHP

## jodaka

стоят свежеустановленные apache2 2.0.52 и php 4.3.10.

создаем файл:

```
<?

session_start();

$_SESSION['yo'] = '111';

?>
```

запускаем в броузере и видим:

```
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 в пхп. Это видно на примере:

```
<?

 if (!headers_sent($fname, $lnum)) {

    session_start();

  } else {

    trigger_error("Невозможно начать сессию, HTTP заголовок уже отправлен файлом $fname, на строке $lnum");

  }

?>

```

запускаем и в броузере видим:

```

Notice: Невозможно начать сессию, HTTP заголовок уже отправлен файлом /home/www/kc/www/jod/index2.php, на строке 1 in /home/www/kc/www/jod/index2.php on line 6
```

вот настройки php:

```

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

```

замечу, что проект, который я сейчас пытаюсь запустить успешно протестирован на старом альт линуксе с древним пхп и апачем, а также под виндой.

помогите пожалуйста настроить пхп/апач.

----------

## Ubnormal

Ну для начала полезно 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 =)

----------

## jodaka

 *Quote:*   

> Ну для начала полезно RTFM =)

 

поверьте, прежде чем тут спрашивать я пол дня сам пытался проблему решить и все доки просмотрел и весь инет перегуглил

 *Ubnormal wrote:*   

> 
> 
> А вообще обрати внимание на переменные session.use_cookies у тебя эта возможность выключена вообще - т.е. идентификатор сессии впринципе не шлется клиенту(напомню что слать идентификатор сессии в куки это общепринятая и наиболее безопасная практика) 
> 
> 

 

либо через урл. Хотя у меня в настройках всё было выключено. Я пол дня экспериментировал с настройками и ничего не помогает.

Однако вы не увидели сути вопроса.

Посмотрите на кусок кода, где есть headers_sent

проблема даже не с сессиями (я уже описал, что сессии создаются и переменные в них сохраняются), проблема в том, что HTTP заголовки шлются СРАЗУ, как только пхп парсер встречает "<?"

 *Ubnormal wrote:*   

> 
> 
> включи session.use_cookies
> 
> поправь session.cookie_path c "/tmp" на "/"
> ...

 

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

проблема в слишком рано посланных заголовках

----------

## Ubnormal

Проблему я понял прекрасно, просто сразу увидел нелепый конфиг и взялся за перо =) Видимо вы решили пойти от обратного, создав заведомо нерабочую конфигурацию =)

Единственное, что мне приходит в голову глядя на конфиг стандартный конфиг ПХП так это то что у вас возможно в 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

----------

## YD

До <?php случаем нету пробелов или переноса строк, и т.п.? Если "<" не первой символ(даже не первый непечатуемый) в файле, то в этом причина.

----------

## jodaka

 *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

----------

## Ubnormal

 *jodaka wrote:*   

> 
> 
> вчера перепробовал разные версии и апачей и пхп и докопался до истины.
> 
> проблема оказалась в кодировке файла. У меня локаль UTF8. Если создать файл в другой кодировке - всё ок, в UTF-8 - косяк. Где ковырять настройки UTF ?
> ...

 

Очень странно.... У меня локаль тоже UTF-8 Apache2 и PHP5 и куча исходников PHP набрана именно в UTF-8 и никогда никаких проблем не было. Рискну предположить что юникод здесь абсолютно не при чем это и ни коим образом не должен влиять на порядок отсыла заголовков. Единственное что вызывает подозрения так это тот факт, что любой юникодный текст если я не ошибаюсь начинается с пары каких-то юникодных козявок. Соответственно, если интерпретатор пхп каким-то образом решит, что  кодировка файла не юникод, вполне возможна ситуация, что он эти козявки отправит клиенту =) И тогда при отключенной буферизации(кстати думаю твой случай) - пиши пропало тогда получается, что контент действительно ушел и заголовки слать поздно. Думаю что это твоя ситуация. Думаю что надо копать в сторону системной локали, локали файловой системы и типо того. Давай ка 

$ locale 

в студию

----------

## jodaka

 *Ubnormal wrote:*   

> Давай ка 
> 
> $ locale 
> 
> в студию

 

```
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 заголовки" :-/

----------

## Ubnormal

Всё я сдаюсь =) Ну если правильный редактор поможет, то мой правильный редактор GVim =)))

----------

## YD

Да, слышал у людей на M$ были траблы с тем, что 2-3 символа вначале, которые тольков HEX editor'e видны. KWrite к примеру нормально работает, когда стоит тип кодировки UTF-8.

----------

