Tôi gặp sự cố với trang web PHP mà tôi đang chạy tại nơi mà người dùng bị đăng xuất sau vài phút (thời gian chính xác thay đổi, nhưng thường xuyên xảy ra sự cố), bất kể họ đã tích cực sử dụng trang web hay không.Phiên PHP hết hạn sớm
Khó khăn là tôi không thể tái tạo vấn đề này, nếu tôi đăng nhập với cùng người dùng bằng cùng một trình duyệt, tôi không bị đăng xuất, điều này cho thấy đây không phải là trường hợp trang web bị hỏng hoàn toàn. Rất tiếc, tôi không có quyền truy cập vào các máy của người dùng để chạy bất kỳ phần mềm quét tìm lưu lượng truy cập nào.
Những điều tôi đã kiểm tra là:
- Yêu cầu người dùng thử trình duyệt khác nhau. Điều này dường như không giải quyết được vấn đề và không phải là giải pháp dài hạn vì tôi không thể quyết định trình duyệt nào khách hàng sẽ sử dụng.
- Thời gian của máy chủ là chính xác và phù hợp với các máy người dùng.
- Người dùng Apache chạy khi có quyền ghi vào thư mục phiên và tôi có thể thấy các tệp phiên được tạo và thời gian sửa đổi của họ đang được cập nhật.
- Không có chức năng đệm đầu ra nào đang được sử dụng.
- Sự cố xảy ra trên nhiều trang dường như không có điểm chung (nghĩa là không phải tất cả đều sử dụng AJAX hoặc cập nhật cơ sở dữ liệu hoặc một số lý do khác).
- Người dùng chỉ truy cập tài khoản của họ từ một máy, nghĩa là họ không thực hiện một chút công việc trên máy tính xách tay của họ, chuyển sang màn hình nền và sau đó tự hỏi tại sao họ đăng xuất trên máy tính xách tay của họ đăng nhập đồng thời cho cùng một người dùng).
Cài đặt phiên trong PHP là mặc định của Debian và chưa được thay đổi trong tệp .htaccess hoặc bất kỳ nơi nào khác. Những người chính là:
session.cookie_lifetime 0
session.gc_divisor 100
session.gc_maxlifetime 1440
session.gc_probability 0
session.save_handler files
session.save_path /var/lib/php5
session.use_cookies On
Debian xóa phiên thông qua một công việc định kỳ thay vì sử dụng thu gom rác của PHP, đó là lý do gc_probability được thiết lập để 0. Phiên bản PHP chúng tôi đang chạy là: PHP 5.2.6-1 + lenny13 với Suhosin-Patch 0.9.6.2 (cli) (phiên bản mới nhất trong Lenny, chúng tôi sẽ nâng cấp lên Squeeze sớm nhưng tôi không nghĩ đó là nguyên nhân của vấn đề).
Chúng tôi sử dụng Zend_Session để quản lý phiên, và một thể hiện của Zend_Session_Namespace được tạo ra một lần trên mỗi trang, do đó tự động gọi session_start(). Các phiên bị xóa bằng cách gọi Zend_Session :: destroy() trên trang đăng xuất, do đó, cách duy nhất để người dùng đăng xuất là:
- Nếu họ nhấp vào liên kết đăng xuất một cách rõ ràng (chúng tôi đăng nhập khi điều này xảy ra và nó không dường như không phải là trường hợp duyệt web đang tìm nạp trước trang và do đó đăng xuất người dùng ra).
- Nếu họ rời phiên không hoạt động trong hơn 24 phút, tại thời điểm đó Debian có thể xóa phiên của họ (có một công việc định kỳ chạy mỗi nửa giờ xóa tất cả các phiên không được sửa đổi trong hơn 24 phút).
- Nếu họ đóng trình duyệt, vì cookie phiên của họ với thời gian hết hạn là 0 sẽ bị xóa.
Các kiểm tra cho thấy cho dù một người dùng đang đăng nhập là:
- Họ có một phiên hợp lệ (kiểm tra bằng cách nhìn thấy cho dù chúng ta có thể truy cập $ zsession-> user_id).
- Có một hàng trong bảng phiên có ID người dùng và ID phiên phù hợp và cập nhật này được cập nhật lần cuối chưa đầy một giờ trước. Chúng tôi xóa hàng này khi đăng xuất để ngay cả khi phiên đó vẫn tồn tại trên đĩa, không ai có thể truy cập tài khoản đó mà không cần đăng nhập.
Có thể đề xuất những điều khác mà tôi có thể thử không?
Edit: Một số điều bổ sung Tôi đã cố gắng dựa trên ý kiến trái:
- Thiết session.cookie_domain: Đây dường như có hành vi rất kỳ quặc trong PHP. Nếu tôi không đặt biến này và để mặc định là '' (chuỗi rỗng), thì yêu cầu cho www.domain.com sẽ tạo ra một cookie của www.domain.com. Tuy nhiên, nếu tôi đặt cookie_domain thành 'www.domain.com', tên miền cho cookie là '.www.domain.com' (dấu chấm đầu thông báo, có nghĩa là hợp lệ cho mọi thứ bên dưới www.domain.com, ví dụ: subsite.www .domain.com).
- Đặt session.cookie_lifetime: PHP dường như không cập nhật thời gian hết hạn trên mỗi yêu cầu, vì vậy nếu tôi đặt cookie_lifetime thành 3600, cookie sẽ hết hạn sau một giờ sau khi người dùng truy cập trang web lần đầu tiên, ngay cả khi họ đăng nhập và sử dụng liên tục .
Chỉnh sửa 2: Dựa vào những thứ khác người đã hỏi: trang web
- được lưu trữ trong một trung tâm dữ liệu, trên một VLAN riêng biệt. Không ai truy cập trang web trên cùng một mạng với trang web.
- Không có xác thực IP được sử dụng, cũng không phải là địa chỉ IP của ứng dụng được sử dụng trong bất kỳ phần nào của quá trình phiên (ví dụ: chúng tôi không đính kèm phiên vào địa chỉ IP và chặn người dùng nếu yêu cầu tiếp theo của họ đến từ IP khác nhau).
Lần cuối cùng tôi gặp sự cố tương tự, tôi đã bỏ lỡ các phiên chính xác trong một tệp php nhất định (tất cả các tệp khác đều ổn). Kết quả là phiên đã trở thành không hợp lệ sau khi người dùng cố gắng rời khỏi trang nhất định đó để anh ấy đã đăng xuất sau các loại phút khác nhau tùy thuộc vào thời điểm anh ấy điều hướng đến trang. Đừng xem đây là giải pháp. Xem nó như là một gợi ý, nơi bạn có thể tìm một số sai lầm. Chúc may mắn! ^^ – Marco
Các múi giờ (hoặc thời gian máy chủ sai) có thể gây ra sự cố trong một số trường hợp. – Smar
@Smar Nó có thể nhưng tôi đã nói rõ ràng 'Thời gian máy chủ là chính xác và phù hợp với máy người dùng'. – pwaring