2010-09-24 28 views
9

Session_start() có phải kéo dài tuổi thọ của cookie phiên ID bằng biến session.gc_maxlifetime không?Phiên PHP không mở rộng hết hạn cookie trên mỗi yêu cầu

Phiên của tôi.gc_maxlifetime là 24 phút và mỗi phiên chỉ hoạt động 24 phút bất kể hoạt động bổ sung trên trang web. Tôi nhận được phiên của tôi, làm mới trang và thời gian hết hạn không thay đổi. Điều này dẫn đến việc đăng xuất sau 24 phút đăng nhập, bất kể điều gì. Có gì sai với cấu hình của tôi không?

+0

Tôi có cùng một vấn đề như bạn đã làm ở đâu phiên nên được mở rộng miễn là có hoạt động và sau khi thực hiện nhiều thử nghiệm cục bộ, tôi thấy việc thêm session_regenerate_id() là cách tốt nhất cho bản thân mình. –

Trả lời

3

Tôi nghĩ rằng bài này sẽ cung cấp các giải pháp bạn đang tìm kiếm: Session timeouts in PHP: best practices

Về cơ bản, khi session_start() được gọi, có một xác suất 1% (theo mặc định) rằng thu gom rác sẽ được chạy. Khi bộ thu gom rác chạy nó quét và xóa các phiên hết hạn. Tuy nhiên, khi bạn là người dùng duy nhất truy cập vào trang (mà bạn có thể là, trong quá trình phát triển) hoặc có rất ít người dùng, bộ thu gom rác sẽ chỉ chạy khi bạn truy cập một trang. Điều này xảy ra SAU session_start() được gọi, đặt lại bộ hẹn giờ một cách hiệu quả. Thay vì cố gắng giải quyết vấn đề này, chỉ cần thực hiện chức năng session_start() của riêng bạn để thực thi thời gian chờ. Hãy thử chức năng mà @Glass Robot đăng, trong liên kết tôi đã cung cấp cho bạn ở trên.

+0

Vì vậy, PHP không tự động cập nhật cookie trên session_start()? Tôi phải làm điều đó bằng tay? –

+0

Nó cập nhật bộ hẹn giờ hết hạn, nhưng bộ hẹn giờ này được đặt lại khi bạn truy cập một trang khác. Hãy thử chức năng @Glass Robot đã đăng (xem bài đăng của tôi). –

+0

Có nên tạo lại ID phiên cho mỗi yêu cầu không? –

3

Tôi đã nhận thấy hành vi này trong PHP và đã thử mọi cấu hình trên PHP nhưng không có may mắn cho đến thời điểm này.

Phiên của tôi sắp chết đúng thời gian từ ngày session_start() đầu tiên, hãy xem xét thời lượng cookie, nó không gia hạn thời gian hết hạn.

Ứng dụng của tôi đã có số lượng khách hàng quan trọng, khoảng 60 kết nối mỗi giây, do đó GC được nhấn mỗi 1,5 giây (tôi đoán).

Giải pháp của tôi cho thời gian cookie không mở rộng là một cái gì đó như thế này (Nó có vẻ không thanh lịch, nhưng làm việc cho tôi).

function my_session_start($maxtime = 300){ 
    // $maxtime = 300 for 5 minutes 
    session_start(); 
    $_sess_name = session_name(); 
    $_sess_id = session_id(); 
    // Update cookie ;) 
    setcookie($_sess_name, $_sess_id, time() + $maxtime, "/"); 
} 

Đó là giải pháp cụ thể của tôi, như câu hỏi cho biết "cookie ID phiên". Có thể không phải là tối ưu, nhưng thực sự nó làm việc cho tôi!

+0

Tôi chỉ đang thử điều này, và tôi phải thay đổi dòng cuối cùng thành 'setcookie ($ _ sess_name, $ _sess_id, time() + $ maxtime,"/");' để lấy đường dẫn của cookie. Nếu không có tham số thứ tư đó, mỗi thư mục sẽ có một cookie riêng và có thể là phiên riêng của nó. (Tôi đã không chơi với nó đủ lâu để trêu chọc tất cả các hậu quả.) – user1618143

+0

Trong thực tế tôi đã nhấn vấn đề bình luận của bạn, liên quan đến con đường trên Cookie, tôi sẽ cập nhật câu trả lời của tôi, cảm ơn !! –

5

Tôi cũng gặp sự cố với điều này. Tôi đã nghĩ rằng mỗi

session_set_cookie_params($sessionTime, '/', $domain); 
session_start(); 

làm cho thời gian hết hạn cho cookie PHPSESSID được gia hạn. Nhưng thực sự cookie PHPSESSID được đặt bởi session_start() chỉ lần đầu tiên trong phiên khi id phiên mới được tạo.

Mục tiêu của tôi là thời gian hết hạn phiên sẽ được tạo lại mỗi khi trang được mở. Tôi đã tìm ra phiên hết hạn có thể vì hai lý do:

  1. Cookie PHPSESSID hết hạn, và thời gian hết hạn của nó không được tái sinh bởi session_start(), vì vậy phiên sẽ luôn hết hạn vì cookie với thời gian hết hạn.
  2. Không hoạt động nào của người dùng sẽ khiến phiên đó sẽ hết hạn ở phía máy chủ. Nó được thiết lập bởi ini_set('session.gc_maxlifetime', $sessionTime).

Giải pháp trong trường hợp này là khi bạn sẽ không thiết lập thời gian hết hạn cho cookie, nhưng session.gc_maxlifetime vẫn thiết lập:

function my_session_start($maxtime = 300) 
{ 
    ini_set('session.gc_maxlifetime', $maxtime); 
    session_set_cookie_params(0, '/', "." . $domain); 
    session_start(); 
} 

Quan trọng nhất là 0 trong session_set_cookie_params(0, '/', "." . $domain) thì cookie sẽ không hết hạn và có không cần kéo dài thời gian hết hạn. Cookie này sẽ bị xóa khi trình duyệt bị đóng. Sau đó, chúng tôi chỉ giới hạn theo thời gian hết hạn ở phía máy chủ.

Tôi cũng gặp vấn đề với việc tôi không thể kéo dài thời gian phiên PHP bởi jQuery Ajax PING vì tôi đã đặt thời gian hết hạn cho PHPSESSID trong cookie. 0 giải quyết tất cả sự cố với các phiên kết thúc không mong đợi. Xin lỗi vì tiếng Anh của tôi. Chúc may mắn.

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