Nasıl PHP kilitlemek session_start nedir?

2 Cevap php

Başlangıçta, sadece oturumu o session_start kilitleri doğrulamak istiyorum. Yani, aşağıdaki gibi bir PHP dosyası oluşturun. Sayfa görünümü bile eğer Temelde, sayfa 10 saniye boyunca uyur; sayfa görünümü tek ise, öyle değil. Ve, session_start $_SESSION de sayfa görünümü elde etmek için kullanılır.

Ben bir tarayıcı iki sekme sayfasına erişmek için çalıştı. Ben bunu açıkça uyusun yana ilk sekme 10 saniye sürer bu şaşırtıcı değildir. İkinci sekme uyku olmaz, ama sessiont_start tarafından bloke edilmelidir. Beklendiği gibi çalışır.

Benim için sürpriz, ikinci sayfanın çıkış session_start hemen hemen hiçbir zaman alır gösterir. Aslında, tüm sayfayı yüklemek için hiçbir zaman alır gibi görünüyor. Ancak, sayfa tarayıcıda göstermek için 10 saniye sürer.

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

Yapar PHP özü session_start PHP sayfası üzerinden ve diğer PHP ifadeleri önce çalıştırmak?

Bu kodudur.

<?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'];

?>

2 Cevap

That seems to be a firefox related "issue". If you request the same url in two tabs/windows the second request waits until the first request is finished (could also be an addon that blocks the second request, haven't tested that).
Take e.g.

<?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>';

Ben iki kez aradım ve çıkış oldu

start: 1269742677.6094

1269742677.6094
1269742682.609
4.9995958805084

ve

start: 1269742682.6563

1269742682.6563
1269742687.6557
4.9994258880615

Başlangıç ​​saatleri arasında 5 saniye boşluk zaten orada olduğunu unutmayın.

When called as http://localhost/test.php ve http://localhost/test.php?a=b instead of the exact same url twice this does not happen.
Both IE8 ve Chrome do not show that behavior.

Evet, Bunun nedeni session_start of () (tabanlı dosya) aynı seansta diğer isteklerini engelliyor olabilir. Ben varsayılan oturum işleyicisi (dosya) ile Windows XP / PHP 5.2 'Firefox (4.x) ve Chrome (10.x) konuyu doğrulamak başardı. Ben bu sorunu olmayan dosya oturumu eylemciler için tekrarlanabilir olup olmadığından emin değilim.

obtained lock
**Cost time: 9.90100598335**
Start 1303227658.67
End 1303227668.57
sleep 10 seconds
allover time elpased : 19.9027831554
The page views: 4

Bu çok ilginç bir konudur ve yukarıda cevap açıklanan Firefox sekme kilitleme tespit edilmeden bu bir gölgede olurdu.

http://www.php.net/manual/en/function.session-start.php#101452