Два одновременных запроса от одного пользователя могут создать два отдельных идентификатора сеанса, отправленных обратно в cookie, и, следовательно, висящий сеанс. Есть ли способы избежать этого или это крайний случай, который не нужно беспокоить (я имею в виду случаи, когда создаются сеансы без истечения срока действия).
Вот очень грубый скрипт для демонстрации:
/* cookie_test.php */
$base_url = $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['SERVER_NAME'].'/'.$_SERVER['SCRIPT_NAME'];
set_time_limit(0);
//load this in 2 browser windows first ?queue_setcookie=1
if (isset($_GET['queue_setcookie'])) {
while(@file_get_contents(__DIR__.'/not_so_great_lock') !== 'unlocked');
$not_so_great_id = rand(0,1000);
setcookie(
'SESSION_ID',
$not_so_great_id,
time() + 30,
'/',
$_SERVER['SERVER_NAME'],
false,
true
);
header('Location:'.$base_url.'?output_cookie=1&created_sid='.$not_so_great_id);
}
//run this next ?unblock_queued_cookies=1
if (isset($_GET['unblock_queued_cookies'])) {
file_put_contents(__DIR__.'/not_so_great_lock', 'unlocked');
}
//will redirect here after cookie creation
if (isset($_GET['output_cookie'])) {
echo 'Current Sess ID:'.$_COOKIE['SESSION_ID'].'<br/>';
echo 'Created Sess ID:'.$_GET['created_sid'];
}
Сохраните скрипт как cookie_test.php в localhost.
Открыть 1-й URL> HTTP: //localhost/cookie_test.php queue_cookie = 1
Открыть 2-й URL> HTTP: //localhost/cookie_test.php queue_cookie = 1
Оба окна будут ждать сигнала для создания.
Затем откройте 3-й URL> HTTP: //localhost/cookie_test.php unblock_queued_cookies = 1
Когда сигнал отправляется, первые два окна создают значения идентификатора, но оба отличаются, и последнее выигрывает.
Задача ещё не решена.
Других решений пока нет …