PHP: setcookie после session_start

B
На сайте с 10.04.2011
Offline
133
2716

Нужен совет профессионала.

На сколько правильным будет использование setcookie после вызова session_start? Я понимаю, что по логике вещей правильнее было бы не совмещать механизм сессий PHP с setcookie, а выбрать что-то одно. Но всё-таки? По факту, во всех браузерах это работает. Тоесть код:

<?


session_start();
setcookie("my_cookie_var", "test_cookie", time()+3600*24*30, "/", ".host.ru");
$_SESSION['my_session_var'] = "test_session";

?>

действительно работает, куки ставятся, кука ид сессии тоже. Проверял везде.

Гугление по данной теме мне ничего не дало. Ну кроме нескольких англоязычных форумов, где человек сталкивался с проблемой в данном случае, но эти топики датируются 2005 годом. Может сегодня этой проблемы уже не стоит? Или всё-таки вызов session_start() и последующий setcookie() - это не есть правильно?

DiAksID
На сайте с 02.08.2008
Offline
236
#1
bitl:
... по логике вещей правильнее было бы не совмещать механизм сессий PHP с setcookie ...

по логике PHP идентификатор сессии может передаваться в том числе и через куки ;) и, чаще всего, именно так и настраивают работу сессий. на мысли не наталкивает?

show must go on !!!...
MK
На сайте с 28.08.2009
Offline
73
#2

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

L
На сайте с 03.10.2008
Offline
32
#3

Не сомневайся, куки не только для сессий созданы, там еще много чего интересного можно хранить!

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#4

Механизм сессий использует куки для идентификации юзера. То есть он ставим ему куку с именем PHPSESSID (дефолтное значение, может изменяться). Далее браузер при каждом* обращении к сайту браузер посылает эту куку и механизм все это дело у себя разруливает(в temporary папке на сервере создаются файлы где хранятся данные, которые Вы ставите через $_SESSION['key']='value';)

setcookie - также ставит куку и также браузер посылает ее каждый раз*, просто эти данные помещаются ПХП в суперглобальный массив $_COOKIE.

* - посылает куку, пока expire действует, если кука просрочена - удаляет ее из своего хранилища(temporary папка у юзера).

По идеи это все равно что подряд вызвать 2 раза подряд setcookie();

Не пойму, в чем может быть конфликт?

Банальный пример - сайт с партнеркой.

На сайт заходит юзер по адресу www.site.ru/index.php?ref=vasya

в файле index.php пишем

setcookie('refer', $_GET['ref'], time()+60*60*24*365);

session_start();

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

А кука нам нужна постоянно. Вдруг юзер щас у нас ничего не купит, а придет уже по закладке на главную страницу через месяц и совершит покупку. В итоге наш vasya получит свое партнерское вознаграждение. Если конечно юзер не зайдет с другого браузера, или не почистит у себя куки.

Подпись))
B
На сайте с 10.04.2011
Offline
133
#5
Милованов Ю.С:
Механизм сессий использует куки для идентификации юзера.

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

IL
На сайте с 20.04.2007
Offline
435
#6
bitl:
session_start() нужно вызывать до отправки любых хидеров, как собственно и в случае с setcookie(),

Почему "хидеров"? Откуда информация?

To use cookie-based sessions, session_start() must be called before outputing anything to the browser.

http://php.net/manual/ru/function.session-start.php

До отправки "текста/кода" (данных в браузер).

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

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
B
На сайте с 10.04.2011
Offline
133
#7
ivan-lev:
Почему "хидеров"? Откуда информация?

Ну читал в нескольких местах подобные утверждения, например вот: http://phpforum.ru/index.php?showtopic=46680


http://php.net/manual/ru/function.session-start.php
До отправки "текста/кода" (данных в браузер).
Связано как раз с тем, что при использовании сессий, которые сохраняют идентификатор в куках, функция посылает заголовок-header с этой самой кукой

Тоесть так:

header("Content-Type: text/html; charset=utf-8");

session_start();

тоже можно?

Получается, что каждая из этих функций (header(), session_start(), setcookie()) не формирует отдельно-взятый блок хидеров, а лишь дописывает в него строку "Cookie: name=value"?

Вот в общем-то в чём был вопрос: не генерирует ли session_start() завершенный блок заголовков? И не получается ли, что подряд вызванные вышеописанные функции формируют двойной хидер-блок (разделенный пустой строкой), который обрабатывается браузерами постольку-поскольку, но по сути нарушает стандарты?

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#8

С фига ли гости понаехали? С чего ради это он будет закрывать блок с заголовками? Откуда вообще такая мысль возникла?

По этой ссылке(http://phpforum.ru/index.php?showtopic=46680) - автор тупит. У него банально был вывод контента до session_start'a, так как ему выдало 2 ошибки(на хедер с кодировкой и на старт сессии). Если бы и была трабла в закрытии session_start'om блока заголовков, то 1 хедер с контент-тайп отработал бы нормально и соответственно session_start тоже. Ошибка бы была только если их поменять местами! Но это бред чистой воды:)

test.php(charset: utf-8 without BOM-signature)

<?php

error_reporting(E_ALL);

header('123: 123');

session_start();

?>

Пробуйте и убеждайтесь.

B
На сайте с 10.04.2011
Offline
133
#9
Милованов Ю.С:

test.php(charset: utf-8 without BOM-signature)
<?php
error_reporting(E_ALL);
header('123: 123');
session_start();
?>

Пробуйте и убеждайтесь.

Естественно я пробовал. Просто хотел уточнить у коллективного разума :) Ибо нигде в документации php не встречал примеров, где бы session_start использовался вместе с setcookie, как впрочем и запрета так делать.

dkameleon
На сайте с 09.12.2005
Offline
386
#10
bitl:
Я в курсе. Просто, например, session_start() нужно вызывать до отправки любых хидеров, как собственно и в случае с setcookie(), и тут у меня сомнения.

до отправки контента, а не хидеров.

Дизайн интерьера (http://balabukha.com/)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий