Trong bài viết Khắc phục lỗi mất session trong Codeigniter (ci) tôi đã chia sẻ cách khắc phục lỗi mất session của ci. Trong đó, nguyên nhân mất session là không có quyền ghi trên file vào thư mục tạm của host. Và hướng giải quyết là chuyển sang lưu session trong database.
Thì hôm nay, tôi xin chia sẻ tiếp một nguyên nhân mất session trong ci nữa. Lần này nguyên nhân là do trật tự thiết lập trình tự khởi động session chưa đúng trong bộ core của ci.
1. Mô tả hiện trạng
Về lỗi này không có biểu hiện đặt trưng cho từng nguyên nhân. Nó chỉ có biểu hiện chung chung là khi chuyển trang thì session bạn đã đăng ký bị mất.
2. Nguyên nhân và cách khắc phục
Sau một thời gian bug điên đầu, tôi phát hiện một nguyên nhân do trong bộ core của ci thiết lập sai trình tự khởi động sesstion: Khởi động session xong mới quay lại thiết lập các thông số cho session. Cụ thể như sau:
Ở file system/libraries/Session/Session.php, tại hàm __construct (hình 1)
Ở hàm __construct này, tôi phát hiện hàm session_start() được gọi trước việc thiết lập các thông số cấu hình sau cho session sử dụng:
session_set_save_handler( array($class, 'open'), array($class, 'close'), array($class, 'read'), array($class, 'write'), array($class, 'destroy'), array($class, 'gc') ); register_shutdown_function('session_write_close');
và các thông số được hàm __construct gọi thông qua hàm _configure như sau:
ini_set('session.use_trans_sid', 0); ini_set('session.use_strict_mode', 1); ini_set('session.use_cookies', 1); ini_set('session.use_only_cookies', 1); ini_set('session.hash_function', 1); ini_set('session.hash_bits_per_character', 4);
Do đó, để fix lỗi này chúng ta thực hiện điều chỉnh lại thứ tự gọi hàm session_start() như sau:
Chúng ta thực hiện đem hàm session start từ vị trí được tô màu đỏ lên vị trí được tô màu xanh của hàm __construct tại file file system/libraries/Session/Session.php là lỗi được khắc phục.
Nói thì vòng vo nhưng fix thì chỉ cần thực hiện đơn giản vậy thôi à.
Hy vọng hữu ích với bạn!
Nosomovo