Ответ 1
Я хотел бы знать, есть ли способ предотвратить отправку cookie PHP при вызове session_start().
Да, есть, говоря PHP, чтобы не использовать файлы cookie для сеансов. Параметр PHP session.use_cookies
:
ini_set('session.use_cookies', 0); # disable session cookies
session_start();
По умолчанию куки включены, потому что они считаются более безопасными, а затем используют параметры URL (см. Сессии и безопасность & shy; Docs).
(2) Наконец, у меня есть процесс рендеринга после страницы (для статистики), для которого требуется доступ на запись к сеансу. Сеанс закрыт, я не могу снова вызвать session_start(), так как он отправляет файл cookie, и он опаздывает на это. Это сложный процесс вычисления, поэтому я должен сделать это после того, как страница будет отправлена клиенту.
Вероятно, можно сказать PHP, что cookie уже установлен, добавив его в $_COOKIE
суперглобальный массив & shy; Docs. Я никогда не экспериментировал с ним, но если вы используете session_start()
, и PHP видит, что cookie сеанса уже установлен (браузером, а не PHP, $_COOKIE
представляют куки файлы браузера), он не будет отправлять заголовки ( снова), чтобы установить файл cookie (который, как я понимаю, вы хотите).
Изменить: Некоторое испытание script для воспроизведения:
<?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-сессии должны быть настроены для работы).