Xử lý phiên là phần quan trọng nhất trong Máy chủ trong Yii Framework 2. 0. Cửa hàng phiên là một cách để lưu trữ thông tin giá trị được sử dụng trên nhiều trang để kiểm tra từng yêu cầu của người dùng. Trong PHP đơn giản như as a , mọi người chúng ta đều có thể truy cập vào kho lưu trữ phiên thông qua các biến toàn cục được sử dụng để $_SESSION
Tôi đã sử dụng chức năng yii2 tích hợp để thiết lập phiên. Tôi không thể sử dụng thông tin đăng nhập yii2 tích hợp vì một số yêu cầu
Vì vậy, tôi đã đặt phiên sử dụng bên dưới
yii. $app->session->set['unique_code', 'xxxx'];
và trong cấu hình/chính của tôi. tập tin php
'session' => [
// this is the name of the session cookie used for login on the frontend
'name' => 'project-frontend',
'timeout' => 60*60*24*30,
],
Nhưng người dùng vẫn đăng xuất khỏi trang web sau một thời gian
Vậy làm cách nào để tăng thời gian chờ của phiên trong trường hợp này?
Giải pháp tốt nhất
Tôi sẽ đề nghị bạn rằng nếu bạn chỉ muốn hủy phiên cụ thể thì hãy đặt hai phiên
Yii::$app->session->set['unique_code', 'xxxx'];
Yii::$app->session->set['code_time', 'xxxx'];
Kiểm tra thời gian hiện tại với code_time, sau khi kết thúc, hãy bỏ đặt cả hai phiên
nếu bạn muốn người dùng nên đăng xuất sau một thời gian nhất định với giải pháp hiện tại
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => false,
'authTimeout' => 3600, // auth expire
],'session' => [
'class' => 'yii\web\Session',
'cookieParams' => ['httponly' => true, 'lifetime' => 3600 * 4],
'timeout' => 3600*4, //session expire
'useCookies' => true,
],
Giải pháp liên quan
Php – Cách hết hạn phiên PHP sau 30 phút
Bạn nên thực hiện thời gian chờ phiên của riêng mình. Cả hai tùy chọn được đề cập bởi những người khác [phiên. gc_maxlifetime và phiên. cookie_lifetime] không đáng tin cậy. Tôi sẽ giải thích lý do cho điều đó
Đầu tiên
phiên. phiên gc_maxlifetime
. gc_maxlifetime chỉ định số giây sau đó dữ liệu sẽ được xem là "rác" và được dọn sạch. Thu gom rác xảy ra trong khi bắt đầu phiên.
Nhưng bộ thu gom rác chỉ được bắt đầu với xác suất của phiên. gc_probability chia cho phiên. gc_divisor. Và sử dụng các giá trị mặc định cho các tùy chọn đó [tương ứng là 1 và 100], cơ hội chỉ ở mức 1%
Chà, bạn chỉ cần điều chỉnh các giá trị này để bộ thu gom rác được khởi động thường xuyên hơn. Nhưng khi bộ thu gom rác được khởi động, nó sẽ kiểm tra tính hợp lệ của mỗi phiên đã đăng ký. Và đó là tốn nhiều chi phí
Hơn nữa, khi sử dụng phiên mặc định của PHP. save_handler, dữ liệu phiên được lưu trữ trong các tệp theo đường dẫn được chỉ định trong phiên. Lưu đường dẫn. Với trình xử lý phiên đó, tuổi của dữ liệu phiên được tính vào ngày sửa đổi cuối cùng của tệp chứ không phải ngày truy cập cuối cùng
Ghi chú. Nếu bạn đang sử dụng trình xử lý phiên dựa trên tệp mặc định, hệ thống tệp của bạn phải theo dõi thời gian truy cập [atime]. Windows FAT thì không, vì vậy bạn sẽ phải nghĩ ra một cách khác để xử lý việc thu gom rác trong phiên của mình nếu bạn gặp khó khăn với hệ thống tệp FAT hoặc bất kỳ hệ thống tệp nào khác không có tính năng theo dõi thời gian. Kể từ PHP 4. 2. 3 nó đã sử dụng mtime [ngày sửa đổi] thay vì atime. Vì vậy, bạn sẽ không gặp sự cố với các hệ thống tệp không có tính năng theo dõi thời gian
Vì vậy, có thể xảy ra trường hợp tệp dữ liệu phiên bị xóa trong khi bản thân phiên đó vẫn được coi là hợp lệ do dữ liệu phiên không được cập nhật gần đây
Và thứ hai
phiên. cookie_lifetime
phiên. cookie_lifetime chỉ định thời gian tồn tại của cookie tính bằng giây được gửi tới trình duyệt. […]
Vâng đúng vậy. Điều này chỉ ảnh hưởng đến thời gian tồn tại của cookie và bản thân phiên đó vẫn có thể hợp lệ. Nhưng nhiệm vụ của máy chủ là vô hiệu hóa một phiên chứ không phải máy khách. Vì vậy, điều này không giúp được gì. Trên thực tế, có phiên. cookie_lifetime được đặt thành 0
sẽ biến cookie của phiên thành cookie phiên thực chỉ hợp lệ cho đến khi đóng trình duyệt
Kết luận / giải pháp tốt nhất
Giải pháp tốt nhất là thực hiện thời gian chờ phiên của riêng bạn. Sử dụng dấu thời gian đơn giản biểu thị thời gian của hoạt động cuối cùng [i. e. request] và cập nhật nó với mọi yêu cầu
if [isset[$_SESSION['LAST_ACTIVITY']] && [time[] - $_SESSION['LAST_ACTIVITY'] > 1800]] {
// last request was more than 30 minutes ago
session_unset[]; // unset $_SESSION variable for the run-time
session_destroy[]; // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time[]; // update last activity time stamp
Cập nhật dữ liệu phiên với mọi yêu cầu cũng thay đổi ngày sửa đổi của tệp phiên để phiên không bị bộ thu gom rác xóa sớm
Bạn cũng có thể sử dụng dấu thời gian bổ sung để tạo lại ID phiên theo định kỳ để tránh các cuộc tấn công vào phiên như cố định phiên
if [!isset[$_SESSION['CREATED']]] {
$_SESSION['CREATED'] = time[];
} else if [time[] - $_SESSION['CREATED'] > 1800] {
// session started more than 30 minutes ago
session_regenerate_id[true]; // change session ID for the current session and invalidate old session ID
$_SESSION['CREATED'] = time[]; // update creation time
}
ghi chú
session.gc_maxlifetime
ít nhất phải bằng thời gian tồn tại của trình xử lý hết hạn tùy chỉnh này [trong ví dụ này là 1800];- nếu bạn muốn hết hạn phiên sau 30 phút hoạt động thay vì sau 30 phút kể từ khi bắt đầu, bạn cũng cần sử dụng
setcookie
với thời gian hết hạn là
0 để giữ cho cookie phiên hoạt độngYii::$app->session->set['unique_code', 'xxxx']; Yii::$app->session->set['code_time', 'xxxx'];
Php – Yii2 Advanced – Tạo backend sử dụng bảng ‘admin’ và mô hình ‘Admin’
Tôi đã giải quyết vấn đề này. ]
Bạn phải chỉnh sửa cấu hình chính của từng [giao diện người dùng và phụ trợ] và chỉ định 'identityClass' cho thành phần người dùng, đồng thời thêm 'phiên' và 'yêu cầu' vào danh sách