2010-08-13 44 views
29

Tôi đang sử dụng phiên php trên trang web của mình và có vẻ như chúng đang "biến mất" trong khoảng thời gian ngẫu nhiên. Tôi không biết liệu họ có định thời gian do không hoạt động hoặc nếu có điều gì sai với mã của tôi, nhưng có cách nào để kiểm soát các phiên khi hết hạn không?Phiên PHP hết thời gian quá nhanh

Giống như tôi có thể đặt một thứ gì đó trong mã của mình hoặc thay đổi thứ gì đó trong tệp php.ini?

Cập nhật- Vì vậy, chỉ cần cập nhật tại đây, tôi đã chuyển đổi máy chủ và kỳ diệu các phiên bắt đầu hoạt động. Tôi không có đầu mối gì sai nhưng dường như họ không muốn làm việc một cách chính xác.

+2

Bạn sẽ tìm thấy câu trả lời của mình tại đây: http://stackoverflow.com/questions/1516266/how-long-will-my-session-last/1516284 – svens

+2

Đó là lời cảm ơn tuyệt vời. Thực tế điều này đã kết thúc cực kỳ hữu ích: http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes/1270960#1270960 – jefffan24

+1

Đó thậm chí là tuyệt vời hơn, cảm ơn :) – svens

Trả lời

42

Ngừng hết hạn ngẫu nhiên là một triệu chứng cổ điển của thư mục dữ liệu phiên được nhiều ứng dụng chia sẻ: một ứng dụng có thời gian ngắn nhất session.gc_maxlifetime có khả năng xóa dữ liệu khỏi các ứng dụng khác. Lý do:

  1. PHP lưu trữ tệp phiên trong thư mục tạm thời của hệ thống theo mặc định.
  2. Việc xử lý tập tin được xây dựng trong không theo dõi những người sở hữu những gì phiên file (nó chỉ phù hợp với tên tập tin với session ID):

    Nothing bug good old files

Lời khuyên của tôi là bạn cấu hình một phiên tùy chỉnh riêng thư mục cho ứng dụng của bạn. Điều đó có thể được thực hiện với session_save_path() function hoặc đặt session.save_path configuration directive. Vui lòng kiểm tra tài liệu của khung công tác của bạn để biết chi tiết chính xác về cách thực hiện nó trong codebase của riêng bạn.

+0

Bạn có đề xuất chèn mã này vào mọi trang không? – JM4

+3

@ JM4 - Xem qua họ các câu lệnh [include] (http://php.net/include). –

+0

tôi hiểu bao gồm và yêu cầu. Nếu OP có hàng trăm hoặc hàng ngàn trang thì đây sẽ là một cơn ác mộng nếu không phải là không thể. Tìm và thay thế là có thể giả sử tất cả các trang có một số loại cấu trúc cơ bản nhưng vẫn có vẻ như một cách thực sự kỳ lạ để đi về nó. – JM4

2

Cố gắng sử dụng một phần mã này:

session_start(); 
    $inactive = 600; 
    $session_life = time() - $_SESSION['timeout']; 
    if($session_life > $inactive) { 
    session_destroy(); 
    header("Location: logoutpage.php"); 
    } 
    $_SESSION['timeout']=time(); 
+0

Được rồi vì vậy tôi có một trang php thư viện được bao gồm trên mỗi trang của trang web, tôi giả định bất cứ khi nào họ đăng nhập, tôi sẽ bắt đầu thời gian chờ phiên. Tôi có sử dụng đoạn mã đó trong thư viện để mỗi khi họ tải một trang, nó cập nhật hoạt động của họ? – jefffan24

+0

Điều này sẽ phá hủy mọi phiên sau 10 phút không hoạt động. Xóa tất cả mọi thứ mong đợi đầu tiên và dòng cuối cùng của mã này và bạn sẽ có câu trả lời thực sự cho câu hỏi. – svens

+2

Và đối với tình yêu của lòng tốt, hãy kiểm tra sự tồn tại của các biến trước khi sử dụng chúng! Giả sử $ _SESSION ['timeout'] hợp lệ là Bad (TM) – Fake51

6

Bạn có thể sử dụng nó để làm cho kỹ thuật tương thích ứng dụng của bạn theo Bạn .. Bạn cần phải thực hiện vài thay đổi theo hệ thống của bạn

// Get the current Session Timeout Value 
$currentTimeoutInSecs = ini_get(’session.gc_maxlifetime’); 

Thay đổi Giá trị Thời gian chờ của phiên

// Change the session timeout value to 30 minutes // 8*60*60 = 8 hours 
ini_set(’session.gc_maxlifetime’, 30*60); 
//————————————————————————————– 

// php.ini setting required for session timeout. 

ini_set(‘session.gc_maxlifetime’,30); 
ini_set(‘session.gc_probability’,1); 
ini_set(‘session.gc_divisor’,1); 

//if you want to change the session.cookie_lifetime. 
//This required in some common file because to get the session values in whole application we need to  write session_start(); to each file then only will get $_SESSION global variable values. 

$sessionCookieExpireTime=8*60*60; 
session_set_cookie_params($sessionCookieExpireTime); 
session_start(); 

// Reset the expiration time upon page load //session_name() is default name of session PHPSESSID 

if (isset($_COOKIE[session_name()])) 
    setcookie(session_name(), $_COOKIE[session_name()], time() + $sessionCookieExpireTime, “/”); 
    //————————————————————————————– 
    //To get the session cookie set param values. 

    $CookieInfo = session_get_cookie_params(); 

    echo “<pre>”; 
    echo “Session information session_get_cookie_params function :: <br />”; 
    print_r($CookieInfo); 
    echo “</pre>”; 

Tất cả tốt nhất !!!!

+4

Nó thực sự có. Có thể bạn đang nghĩ đến việc hết hạn cookie. –

12

Debian sử dụng lệnh cron để tự động hết hạn phiên theo cách bảo mật. Nếu bạn đang sử dụng Debian, hãy xem /etc/cron.d/php5.

+0

Ubuntu cũng có một '/ etc/cron.d/php' sử dụng' session.gc_maxlifetime' trong '/ etc/php/7.0/fpm/php.ini' để xóa các phiên từ'/var/lib/php/sessions '. –

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