最初,我只想验证会话中的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
Run Code Online (Sandbox Code Playgroud)
PHP是否从PHP页面中提取session_start并在其他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'];
?>
Run Code Online (Sandbox Code Playgroud)
这似乎是一个与 Firefox 相关的“问题”。如果您在两个选项卡/窗口中请求相同的网址,则第二个请求将等待第一个请求完成(也可能是阻止第二个请求的插件,尚未对此进行测试)。
拿例如
<?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>';
Run Code Online (Sandbox Code Playgroud)
我调用了两次,输出是
start: 1269742677.6094
1269742677.6094
1269742682.609
4.9995958805084
Run Code Online (Sandbox Code Playgroud)
和
start: 1269742682.6563
1269742682.6563
1269742687.6557
4.9994258880615
Run Code Online (Sandbox Code Playgroud)
请注意,开始时间之间已经有 5 秒的间隙。
当调用 和http://localhost/test.php
而http://localhost/test.php?a=b
不是完全相同的 url 两次时,这种情况不会发生。
IE8 和 Chrome 都不会显示这种行为。
归档时间: |
|
查看次数: |
5022 次 |
最近记录: |