Когда я попробовал это:
while (my $cgi = new CGI::Fast) {
...
my $session = CGI::Session->new(undef, $cgi);
...
}
Я обнаружил, что разные клиенты получают один и тот же сеанс! Что будет причиной этого странного совместного использования сеанса?
РЕДАКТИРОВАТЬ: Я не могу воспроизвести это надежно, но в моем тестировании я видел случаи, когда я удаляю cookie сеанса из браузера, обновлял страницу и (используя панель Net Firebug Net) видел, что Я не отправляю cookie в запросе, но получаю Set-Cookie в ответе с старым идентификатором сеанса! Возможно, что-то торчит в памяти из-за использования FastCGI?
(Примечание: я удалил второй фрагмент кода из более ранней версии этого вопроса, потому что я больше не уверен, что он актуален)
РЕДАКТИРОВАТЬ: Это http://osdir.com/ml/web.fastcgi.devel/2004-02/msg00007.html, кажется, описывает поведение, которое я вижу
EDIT:
Как упомянуто в вышеупомянутой публикации osdir.com, FCGI.pm содержит этот код:
for (keys %FCGI::ENV) {
$ENV{$_} = $FCGI::ENV{$_} unless exists $ENV{$_};
}
Это, кажется, довольно явно испорчено моим глазам. Он копирует из постоянной копии переменных среды в копию среды, видимой для сценария, когда текущий запрос не предоставляет значение для данной переменной. Таким образом, если запрос приходит без файлов cookie, он не найдет определенный HTTP_COOKIE, поэтому он передаст сценарию файлы cookie из последнего отправленного запроса, что означает какой-то другой сеанс! Я не понимаю, как этот код может быть правильным, и это очень используемый модуль!