Запрет php session_start () для отправки куки - PullRequest
10 голосов
/ 27 декабря 2011

Я хотел бы знать, есть ли способ запретить PHP отправлять куки при вызове session_start().

Мой вариант использования для оптимизации сайта:

  • (1a) Сначала я открываю заголовки сеанса / отправки.
  • (1b) Затем генерирую и выводю некоторый текстовый контент.
  • (1c) Для улучшения чтения / записи сеанса я вызываю "session_write_close", как только мне больше не нужно писать в сеансе.
  • (2) Наконец, у меня есть пост-процесс рендеринга страницы (для статистики), который требует доступа на запись в сеанс.Сессия закрыта, я не могу снова вызвать session_start (), так как она отправляет куки, и для этого уже поздно.Это сложный процесс, поэтому я должен сделать это после того, как страница отправлена ​​клиенту.

Клиент уже получил cookie-файл сеанса.Поэтому мне не нужно session_start() для отправки нового (и избыточного).

Кто-нибудь знает способ перехватить cookie или что-то подобное?Конечно, я хочу избежать "Не удается отправить cookie сессии - заголовки уже отправлены".Эта ошибка невидима для пользователя, потому что страница уже обработана, но в журналах она выглядит некрасиво.

Мой вопрос кажется излишним, но это не так.Я знаю, как работают заголовки и контент (сначала отправляйте заголовки, потом контент).Просто PHP не позволяет мне делать то, что я хочу.

Ответы [ 3 ]

11 голосов
/ 27 декабря 2011

Я хотел бы знать, есть ли способ запретить PHP отправлять куки при вызове session_start ().

Да, если PHP говорит не использовать куки длясессий.Настройка PHP: session.use_cookies:

ini_set('session.use_cookies', 0); # disable session cookies
session_start();

По умолчанию файлы cookie включены, поскольку они считаются более безопасными, чем параметры URL (см. Сеансы и безопасность Документы ).

(2) Наконец, у меня есть процесс постстраничного рендеринга (для статистики), который требует доступа на запись в сеанс.Сессия закрыта, я не могу снова вызвать session_start (), так как она отправляет куки, и для этого уже поздно.Это трудоемкий процесс, поэтому я должен сделать это после того, как страница отправлена ​​клиенту.

Вероятно, можно сказать PHP, что cookie уже установлен, добавив его в $_COOKIE суперглобальный массив Документы .Я никогда не экспериментировал с этим, но если вы используете session_start() и PHP увидит, что cookie сеанса уже установлен (браузером, а не PHP, $_COOKIE представляет куки браузера), он не будет отправлять заголовки (еще раз), чтобы установить cookie (который, как я понимаю, вам нужен).


Редактировать: Некоторые тестовые сценарии, с которыми можно поиграться:

<?php
header('Content-Type: text/plain;');

echo "Incomming Cookies:\n";
print_r($_COOKIE);

// to simulate that this is a new session, the session cookie is removed
// which makes PHP think it is a new session when invoking session_start()
// unset($_COOKIE['PHPSESSID']);

// run the first session
session_start(); // creates the session cookie (as we don't have one yet)
printf("Session %s has been started: %s\n", session_name(), session_id());
var_dump($_SESSION);
$_SESSION['variable'] = isset($_SESSION['variable']) ? $_SESSION['variable']++ : 0;
session_commit();

printf("Session has been closed, remaining id is: %s\n", session_id());

// visual confirmation that session cookie has been created
echo "Outgoing Cookies:\n";
print_r(headers_list());

// run the second session
ini_set('session.use_cookies', 0); # disable session cookies
session_start();
printf("Second session %s has been started: %s\n", session_name(), session_id());
var_dump($_SESSION);
$_SESSION['2nd-variable'] = isset($_SESSION['2nd-variable']) ? $_SESSION['2nd-variable']++ : 0;
session_commit();

Вы должны вызывать его через веб-браузер (и сеансы PHP должны быть настроены для работы).

5 голосов
/ 23 января 2017

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

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

session_start(array(
   'use_cookies' => '0',
   'cache_limiter' => ''
));

Обратите внимание, что use_cookies предотвращает отправку cookie, а установка ограничителя кэша на пустую строку не позволяет обновлять заголовки кэша (не самая лучшая документированная функция).

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

Warning: session_start(): Cannot send session cookie - headers already sent

и

Warning: session_start(): Cannot send session cache limiter - headers already sent
0 голосов
/ 27 декабря 2011

Вы можете использовать функцию ob_start () для буферизации заголовков / содержимого, вы можете очистить содержимое буфера, используя ob_clean ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...