簡體   English   中英

session_start如何在PHP中鎖定?

[英]How does session_start lock in PHP?

最初,我只想驗證會話中的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是否從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'];

?>

這似乎是一個與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.phphttp://localhost/test.php?a=b而不是兩次完全相同的url時,這不會發生。
IE8和Chrome都沒有顯示該行為。

是的,這可能是因為session_start()阻止了同一會話中的其他請求(基於文件)。 我能夠使用默認會話處理程序(文件)驗證Windows XP / PHP 5.2中的Firefox(4.x)和Chrome(10.x)中的問題。 我不確定這個問題對於非文件會話處理程序是否可重現。

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模塊確實表現得像一個容器,在這種情況下,在這種情況下提供會話管理服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM