代码之家  ›  专栏  ›  技术社区  ›  Morgan Cheng

session\u如何在PHP中开始锁定?

  •  7
  • Morgan Cheng  · 技术社区  · 16 年前

    原来,我只是想验证一下 会话\u开始 会话\u开始 用于获取中的页面视图 $\u会话 .

    会话启动 . 这和预期的一样。

    令我惊讶的是,第二页的输出显示 会话\u开始 几乎不花时间。实际上,整个页面似乎不需要时间加载。但是,该页面在浏览器中显示确实需要10秒钟。

    obtained lock
    Cost time: 0.00016689300537109
    Start 1269739162.1997
    End 1269739162.1998
    allover time elpased : 0.00032305717468262
    The page views: 101
    

    PHP提取吗 会话\u开始 跳出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'];
    
    ?>
    
    3 回复  |  直到 15 年前
        1
  •  4
  •   VolkerK    16 年前

    这似乎是一个与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
    IE8和Chrome都没有显示出这种行为。

        2
  •  1
  •   Murukesh    15 年前

    是的,这可能是因为session\u start()阻塞了同一会话中的其他请求(基于文件)。我在Firefox(4.x)和Chrome(10.x)的WindowsXP/PHP5.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

        3
  •  0
  •   Nitish Pandey    11 年前

    推荐文章