Первоначально я просто хочу проверить, что session_start блокирует сеанс. Итак, я создаю файл PHP, как показано ниже. В принципе, если просмотр страницы ровный, страница спит в течение 10 секунд; если просмотр страницы нечетный, это не так. И session_start используется для получения просмотра страницы в $ _SESSION .
Я попытался открыть страницу на двух вкладках одного браузера. Неудивительно, что первая вкладка занимает 10 секунд, так как я явно позволяю ей спать. Вторая вкладка не будет спать, но она должна быть заблокирована sessiont_start . Это работает так, как ожидалось.
К моему удивлению, вывод второй страницы показывает, что session_start почти не требует времени. На самом деле, вся страница, кажется, не требует времени для загрузки. Но в браузере на страницу требуется 10 секунд.
obtained lock Cost time: 0.00016689300537109 Start 1269739162.1997 End 1269739162.1998 allover time elpased : 0.00032305717468262 The page views: 101
Выводит ли PHP session_start из PHP-страницы и выполняет ее перед другими инструкциями PHP?
Это код.
<?php function float_time() { list($usec, $sec) = explode(' ', microtime()); return (float)$sec + (float)$usec; } $allover_start_time = float_time(); $start_time = float_time(); session_start(); echo "obtained lock<br/>"; $end_time = float_time(); $elapsed_time = $end_time - $start_time; echo "Cost time: $elapsed_time <br>"; echo "Start $start_time<br/>"; echo "End $end_time<br/>"; ob_flush(); flush(); if (isset($_SESSION['views'])) { $_SESSION['views'] += 1; } else { $_SESSION['views'] = 0; } if ($_SESSION['views'] % 2 == 0) { echo "sleep 10 seconds<br/>"; sleep(10); } $allover_end_time = float_time(); echo "allover time elpased : " . ($allover_end_time - $allover_start_time) . "<br/>"; echo "The page views: " . $_SESSION['views']; ?>
Это похоже на проблему, связанную с firefox. Если вы запрашиваете один и тот же URL-адрес в двух вкладках / окнах, второй запрос ожидает завершения первого запроса (также может быть аддоном, который блокирует второй запрос, не проверял это).
Например,
<?php // test.php $start = microtime(true); echo "<pre>start: $start</pre>"; sleep(5); $end = microtime(true); echo '<pre>', $start, "\n", $end, "\n", $end-$start, '</pre>';
Я назвал это дважды, и результат был
start: 1269742677.6094 1269742677.6094 1269742682.609 4.9995958805084
а также
start: 1269742682.6563 1269742682.6563 1269742687.6557 4.9994258880615
Обратите внимание, что между начальными временами уже существует 5-секундный промежуток.
Когда вызывается как http://localhost/test.php
и http://localhost/test.php?a=b
вместо того же самого URL-адреса дважды, этого не происходит.
И IE8, и Chrome не показывают этого поведения.
Да, это может быть из-за того, что session_start () блокирует другие запросы в одном сеансе (на основе файлов). Я смог проверить проблему в Firefox (4.x) и Chrome (10.x) в Windows XP / PHP 5.2 с помощью обработчика сеанса по умолчанию (файла). Я не уверен, что эта проблема воспроизводится для обработчиков нефайлового сеанса.
obtained lock **Cost time: 9.90100598335** Start 1303227658.67 End 1303227668.57 sleep 10 seconds allover time elpased : 19.9027831554 The page views: 4
Это очень интересная проблема, и блокировка вкладки Firefox, описанная в вышеприведенном ответе, затмила бы ее от обнаружения.
http://www.php.net/manual/en/function.session-start.php#101452
Поскольку php не имеет контейнера. Как выполнить два вызова на один сеанс? Кто это делает? Как говорят эти два процесса? Является ли PHP-модуль всегда активным и только порождает потоки после проверки сеанса? В этом случае PHP-модуль действительно ведет себя как контейнер, который в этом случае предоставляет службу управления сеансом в такой степени.