Viết một custom session handler là đáng ngạc nhiên dễ dàng, nhưng tôi nghĩ rằng có nhiều cách có lẽ tốt hơn để lưu trữ dữ liệu phiên hơn MEMORY
bảng.
Một cái gì đó giản đồ như (nâng lên với những thay đổi từ a previous question)
CREATE TABLE IF NOT EXISTS `session` (
`id` char(32) NOT NULL,
`data` varchar(20000) NOT NULL,
`time_created` timestamp NOT NULL default '0000-00-00 00:00:00',
`time_updated` timestamp NOT NULL default '0000-00-00 00:00:00' on update CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `time_created` (`time_created`),
KEY `time_updated` (`time_updated`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8;
sau đó bạn muốn chỉ phải xác định các chức năng điều khiển phiên của bạn, như được nêu trong diễn đàn hoặc trong tutorial này. Nếu bạn muốn lưu thông tin phiên trong quá trình thu gom rác, bạn chỉ cần tạo một bảng giống với bảng ở trên bằng cách sử dụng công cụ INNODB
và thêm một chút vào cuối hàm gc()
sao chép hàng từ các bảng MEMORY
đến INNODB
.
Tuy nhiên MEMORY
bảng có một số giới hạn khá đáng kể. Họ không thể sử dụng các cột BLOB
hoặc TEXT
- đó là lý do tại sao tôi có số này xấu xí varchar(20000)
ở trên. Chúng có kích thước tối đa 16 MB. Nếu bạn có nhiều người dùng, giữ nhiều trạng thái hoặc gặp sự cố với việc thu thập rác, bạn có thể đạt đến giới hạn và sự cố đó.
Ý tưởng tốt hơn là sử dụng memcache
session handler, đặc biệt nếu bạn không cần lưu trữ thông tin phiên vào tương lai xa. Tôi khá chắc chắn memcached
là nhanh hơn bất kỳ RDBMS sẽ được (ngay cả với MEMORY
bảng) và nó cũng quy mô theo thiết kế. Ngoài ra, bạn sẽ không phải viết các hàm xử lý phiên của riêng bạn.
Có thể tăng kích thước bảng tối đa bằng cách điều chỉnh biến hệ thống [max_heap_table_size] (https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_heap_table_size). –