2010-03-28 32 views
7

Ban đầu, tôi chỉ muốn xác minh rằng session_start khóa trên phiên. Vì vậy, tôi tạo một tệp PHP như dưới đây. Về cơ bản, nếu số lần truy cập trang thậm chí là trang sẽ ngủ trong 10 giây; nếu số lần truy cập trang là số lẻ, thì số lần xem trang lại không. Và, session_start được sử dụng để lấy chế độ xem trang trong $ _SESSION.Khóa session_start bằng PHP như thế nào?

Tôi đã cố gắng truy cập trang trong hai tab của một trình duyệt. Nó không phải là đáng ngạc nhiên rằng tab đầu tiên mất 10 giây kể từ khi tôi rõ ràng để cho nó ngủ. Tab thứ hai sẽ không ngủ, nhưng nó sẽ bị chặn bởi sessiont_start. Điều đó hoạt động như mong đợi.

Ngạc nhiên thay, đầu ra của trang thứ hai cho thấy session_start hầu như không mất thời gian. Trên thực tế, toàn bộ trang dường như không mất thời gian để tải. Tuy nhiên, trang này mất 10 giây để hiển thị trong trình duyệt.

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

Liệu trích PHP session_start ra khỏi trang PHP và thực hiện nó trước khi báo cáo PHP khác?

Đây là mã.

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

?> 
+1

Lưu ý microtime (1) tham số hữu ích, làm cho hàm float_time lỗi thời. –

+0

So sánh hai giá trị 'Bắt đầu'. Ví dụ thứ hai "bắt đầu" 10 giây sau lần đầu tiên? – VolkerK

+0

Tôi không thể xác nhận kết quả của bạn. Bằng cách nhấn tải lại trong cả hai tab cho cả yêu cầu, tôi đã chạy 10 giây đầu tiên và 8 giây khác như mong đợi. Trình duyệt Chrome, PHP5.2.5, giành chiến thắng –

Trả lời

4

Điều đó dường như là "sự cố" liên quan đến firefox. Nếu bạn yêu cầu cùng một url trong hai tab/cửa sổ, yêu cầu thứ hai sẽ đợi cho đến khi yêu cầu đầu tiên được hoàn thành (cũng có thể là phần bổ trợ chặn yêu cầu thứ hai, chưa thử nghiệm).
Ví dụ:

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

tôi gọi nó hai lần và sản lượng là

start: 1269742677.6094 

1269742677.6094 
1269742682.609 
4.9995958805084 

start: 1269742682.6563 

1269742682.6563 
1269742687.6557 
4.9994258880615 

Lưu ý rằng có đã là một khoảng cách 5 giây giữa các lần khởi động.

Khi được gọi là http://localhost/test.phphttp://localhost/test.php?a=b thay vì cùng một url chính xác hai lần điều này không xảy ra.
Cả IE8 và Chrome đều không hiển thị hành vi đó.

+0

Wow! Bạn đúng rồi! Làm sao bạn biết điều đó? Tôi chưa bao giờ nghĩ rằng có thể do trình duyệt "vấn đề". –

+0

Đó là nhiều hơn hoặc ít hơn một cách tình cờ ;-) – VolkerK

+1

trong ví dụ session_start() bị thiếu, có trong câu hỏi gốc. bạn đã thử với điều đó chưa? session_start() đang chặn các yêu cầu khác từ cùng một phiên trừ khi bạn giải phóng khóa bằng session_write_close(); http://www.php.net/manual/en/function.session-start.php#101452 – Murukesh

1

Có, Điều này có thể do session_start() chặn các yêu cầu khác trong cùng một phiên (dựa trên tệp). Tôi đã có thể xác minh vấn đề trong Firefox (4.x) và Chrome (10.x) trong Windows XP/PHP 5.2 với trình xử lý phiên mặc định (tệp). Tôi không chắc chắn nếu vấn đề này có thể tái sản xuất đối với các trình xử lý phiên không phải tệp.

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

Đây là vấn đề rất thú vị và khóa tab Firefox được mô tả trong câu trả lời ở trên sẽ làm lu mờ cụm từ này khỏi bị phát hiện.

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

0

Vì php không có vùng chứa. Làm thế nào để hai cuộc gọi đến cùng một phiên được serialized? Ai làm điều này? Làm thế nào để hai quá trình nói chuyện? Mô-đun PHP luôn hoạt động và chỉ sinh ra các luồng sau khi kiểm tra phiên làm việc? Trong trường hợp đó, mô-đun PHP thực sự hoạt động giống như một thùng chứa, trong trường hợp này, cung cấp dịch vụ quản lý phiên trong phạm vi này.

Các vấn đề liên quan