2010-06-18 29 views
44

tôi đang tạo ra một phiên khi người dùng đăng nhập vào như sau:PHP phiên timeout

$_SESSION['id'] = $id; 

Làm thế nào tôi có thể chỉ định một thời gian chờ trên đó phiên phút X và sau đó có nó thực hiện một chức năng hoặc một trang chuyển hướng một lần nó đã đạt đến X phút ??

EDIT: Tôi quên đề cập đến rằng tôi cần phiên để hết giờ do không hoạt động.

+9

bản sao có thể có của [Làm cách nào để hết hạn một phiên PHP sau 30 phút?] (Http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30- phút) – Kzqai

Trả lời

86

đầu tiên, lưu trữ lần cuối cùng người sử dụng tạo ra một yêu cầu

<?php 
    $_SESSION['timeout'] = time(); 
?> 

trong yêu cầu tiếp theo, kiểm tra cách đây bao lâu họ đã yêu cầu trước đó của họ (10 phút trong ví dụ này)

<?php 
    if ($_SESSION['timeout'] + 10 * 60 < time()) { 
    // session timed out 
    } else { 
    // session ok 
    } 
?> 
+20

Nhưng phiên có thể hết thời gian chờ trước đó, nếu thời gian chờ phiên mặc định trong PHPINI của bạn ngắn hơn thời gian bạn đã chọn. Thời gian chờ thường ít hơn một giờ theo mặc định. Nếu bạn không muốn khách hàng kiểm soát thời gian chờ, bạn cần phải kết hợp mã này với một ini_set của session.cookie_lifetime. Câu trả lời này cũng không xử lý trường hợp khách hàng xóa cookie của họ. – Olhovsky

+2

Mặc định PHP là '0' có nghĩa là: "Cho đến khi trình duyệt bị đóng". Nếu trình duyệt xóa cookie, '$ _SESSION ['timeout']' var sẽ không được đặt ở vị trí đầu tiên. Tuy nhiên, tôi bỏ qua tất cả những điều khác về quản lý phiên vì câu hỏi này chỉ hỏi về thời gian chờ. – Jacco

42

Khi phiên sẽ hết hạn dữ liệu là không còn hiện diện, vì vậy cái gì đó như

if (!isset($_SESSION['id'])) { 
    header("Location: destination.php"); 
    exit; 
} 

sẽ chuyển hướng bất cứ khi nào phiên không còn hoạt động.

Bạn có thể đặt bao lâu cookie phiên là sống bằng session.cookie_lifetime

ini_set("session.cookie_lifetime","3600"); //an hour 

EDIT: Nếu bạn đang thời gian buổi ra do lo ngại an ninh (thay vì sự tiện lợi,) sử dụng câu trả lời được chấp nhận, như các ý kiến ​​dưới đây hiển thị, điều này được kiểm soát bởi khách hàng và do đó không an toàn. Tôi chưa bao giờ nghĩ đây là một biện pháp an ninh.

+1

bạn phải xóa dấu ngoặc kép quanh $ _SESSION ['id'] –

+0

Mặc dù câu trả lời của bạn không được bình chọn, giải pháp của bạn có vẻ an toàn hơn, câu hỏi của tôi là, bạn có phải đặt thời gian chờ của phiên trên mỗi trang không? Tôi cho rằng điều đó sẽ có ý nghĩa như bạn muốn nó khởi động lại mỗi lần? Thứ hai bạn phải làm session_start cho mỗi trang để lấy dữ liệu phiên, hoặc chỉ một lần để khởi động nó? Cảm ơn – nagates

+10

Có một số vấn đề với tuổi thọ cookie phiên, đáng chú ý nhất, nó dựa trên * client * để thực thi nó. Tuổi thọ cookie là có để cho phép khách hàng để làm sạch cookie vô dụng/hết hạn, nó không phải là để được nhầm lẫn với bất cứ điều gì liên quan đến bảo mật. – Jacco

0
session_cache_expire(20); 
    session_start(); // NEVER FORGET TO START THE SESSION!!! 
    $inactive = 1200; //20 minutes *60 
    if(isset($_SESSION['start'])) { 
$session_life = time() - $_SESSION['start']; 
if($session_life > $inactive){ 
    header("Location: user_logout.php"); 
} 
    } 
    $_SESSION['start'] = time(); 

    if($_SESSION['valid_user'] != true){ 
    header('Location: ../....php'); 
    }else{ 

nguồn: http://www.daniweb.com/web-development/php/threads/124500

+1

Chỉ cần Googling câu trả lời đầu tiên bạn gặp và dán nó vào Stack Overflow không có lợi cho điểm của trang web này. Hơn nữa, session_cache_expire() không liên quan gì đến độ dài phiên của bạn nên câu trả lời bạn dán vào có thông tin không chính xác. –

+0

@DavidBradbury Theo mặc định, cookie lưu trữ session_id, nếu cookie hết hạn, session_id không thể truy cập khi khách hàng yêu cầu. –

5

Chỉ cần kiểm tra đầu tiên phiên không phải là alrea dy tạo ra và nếu không tạo ra một. Ở đây tôi thiết lập nó chỉ trong 1 phút.

<?php 
    if(!isset($_SESSION["timeout"])){ 
    $_SESSION['timeout'] = time(); 
    }; 
    $st = $_SESSION['timeout'] + 60; //session time is 1 minute 
?> 

<?php 
    if(time() < $st){ 
    echo 'Session will last 1 minute'; 
    } 
?> 
2
<script type="text/javascript"> 
window.setTimeout("location=('timeout_session.htm');",900000); 
</script> 

Trong phần đầu của mỗi trang đã làm việc cho tôi trong những thử nghiệm trang web (trang web chưa được trong sản xuất). Trang HTML nó rơi để kết thúc phiên và chỉ thông báo cho người dùng về nhu cầu đăng nhập lại. Điều này có vẻ là một cách dễ dàng hơn so với chơi với logic PHP. Tôi muốn một số nhận xét về ý tưởng này. Bất kỳ bẫy tôi havent nhìn thấy trong nó?

+4

Không phải tất cả mọi người đều sử dụng js – chuckieDub

+0

Nếu bạn có nhiều tab được mở cùng một trang, bạn phải làm mới tất cả để tạo hoạt động, nếu không bạn tiếp tục làm việc trong 1 tab, những người khác sẽ hiển thị "timeout_session.htm" sau khi hết thời gian chờ. Rất bực bội, đặc biệt nếu "timeout_session.htm" đang hủy/hủy phiên. =) –

1
<?php 
session_start(); 

if (time()<$_SESSION['time']+10){ 
$_SESSION['time'] = time(); 
echo "welcome old user"; 
} 

else{ 
session_destroy(); 
session_start(); 
$_SESSION['time'] = time(); 
echo "welcome new user"; 
} 
?> 
0
<?php 
session_start(); 
if($_SESSION['login'] != 'ok') 
    header('location: /dashboard.php?login=0'); 

if(isset($_SESSION['last-activity']) && time() - $_SESSION['last-activity'] > 600) { 
    // session inactive more than 10 min 
    header('location: /logout.php?timeout=1'); 
} 

$_SESSION['last-activity'] = time(); // update last activity time stamp 

if(time() - $_SESSION['created'] > 600) { 
    // session started more than 10 min ago 
    session_regenerate_id(true); // change session id and invalidate old session 
    $_SESSION['created'] = time(); // update creation time 
} 
?> 
+0

Hãy chắc chắn để nhận xét câu trả lời của bạn và giải thích ở đâu và làm thế nào bạn đang thêm thời gian chờ. – Rias

1

giải pháp Byterbit là vấn đề bởi vì:

  1. có kết thúc thời hạn kiểm soát khách hàng của một cookie phía máy chủ là một vấn đề an ninh.
  2. nếu hết hạn thời gian chờ đặt ở phía máy chủ nhỏ hơn thời gian chờ được đặt ở phía máy khách, trang sẽ không phản ánh trạng thái thực tế của cookie.
  3. ngay cả khi vì sự thoải mái trong giai đoạn phát triển, đây là một vấn đề vì nó sẽ không phản ánh đúng hành vi (trong thời gian) trên giai đoạn phát hành.

cho cookie, đặt hết hạn thông qua session.cookie_lifetime là giải pháp đúng đắn về thiết kế và bảo mật! để hết hạn phiên, bạn có thể sử dụng session.gc_maxlifetime.

hết hạn cookie bằng cách gọi session_destroy có thể mang lại kết quả không thể đoán trước vì chúng có thể đã hết hạn.

thực hiện thay đổi trong php.ini cũng là một giải pháp hợp lệ nhưng nó làm cho toàn bộ hết hạn cho toàn bộ miền có thể không phải là những gì bạn thực sự muốn - một số trang có thể chọn giữ một số cookie nhiều hơn các trang khác.