90% Lập Trình Viên Chưa Thực Sự Hiểu Về Session và Cookie
Session và Cookie là chủ đề không còn xa lạ với các bạn lập trình viên tuy nhiên một sự thật ngạc nhiên là rất nhiều lập trình viên chưa hiểu được chi tiết cách session làm việc với cookie như thế nào. Trong bài viết này chúng ta sẽ cùng nhau phân tích hoạt động của session và cookie thông qua các ...
Session và Cookie là chủ đề không còn xa lạ với các bạn lập trình viên tuy nhiên một sự thật ngạc nhiên là rất nhiều lập trình viên chưa hiểu được chi tiết cách session làm việc với cookie như thế nào. Trong bài viết này chúng ta sẽ cùng nhau phân tích hoạt động của session và cookie thông qua các ví dụ cụ thể sử dụng ngôn ngữ PHP.
PHP Session Là Gì
PHP session về bản chất là các tập tin trên server chứa các thông tin của các client. Ở đây client thông thường sẽ là trình duyệt của người dùng. Tập tin session ứng với mỗi một client (trình duyệt) khác nhau sẽ có tên khác nhau. Chúng ta sẽ tìm hiểu cụ thể hơn về điều này khi chạy các ví dụ trong phần dưới đây.
Địa chỉ đường dẫn của thư mục trên server chứa các tập tin session này có thể thay đổi được. Để hiển thị đường dẫn này bạn có thể sử dụng hàm session_save_path(). Bây giờ bạn hay di chuyển tới địa chỉ thư mục gốc của Apache và sử dụng code editor để tạo một file test_session.php với nội dung như sau:
<?php echo session_save_path();
Tiếp theo chạy tập tin trên sử dụng trình duyệt bằng cách truy cập vào địa chỉ http://localhost/test_session.php. Nếu bạn đang chạy PHP phiên bản 5.6 trên hệ điều hành Ubuntu bạn sẽ thấy kết quả tương tự như sau:
/var/lib/php/sessions
Bạn hãy nhớ địa chỉ đường dẫn này vì chúng ta sẽ cần tới nó ở phần tiếp theo đây.
Tạo Session Trong PHP
Việc gán giá trị cho session được thực hiện thông qua biến toàn cục $_SESSION. Tuy nhiên trước khi bắt đầu tạo session bạn cần gọi hàm session_start() của PHP. Bây giờ trên thư mục gốc của Apache bạn hãy tạo một file test_session.php với nội dung là đoạn code sau:
<?php session_start(); $_SESSION['test_key_1'] = 'Test value 1'; print_r($_SESSION['test_key_1']);
bạn sẽ nhận được kết quả như sau:
Array ( [test_key_1] => Test value 1 )
Hoặc nếu như View Source của trang (sử dụng tổ hợp phím tắt Ctrl + U nếu bạn dùng Ubuntu hoặc Windows, Command + Option + U nếu bạn trên Mac OS X) thì bạn sẽ thấy kết quả:
Array ( [test_key_1] => Test value 1 )
Tới đây vẫn chưa có gì mới với bạn phải không? Nhưng đừng vội dừng lại ở đây mà bạn hãy kiên nhẫn đọc tiếp...
Cookie và Session
Như đề cập ở phần trước mỗi một file session trên server được dùng để lưu thông tin của một client (hay trình duyệt). Như vậy làm cách nào để server phân biệt được file session nào dành cho trình duyệt nào?
Hay nói cách khác làm sao để server có thể phân biệt giữa các trình duyệt khác nhau? Câu trả lời chính là server đã sử dụng dữ liệu lưu trong cookie của trình duyệt (hay đúng hơn là giá trị cookie trong request gửi tới server từ client).
Để hiểu điều này thì bạn hãy mở Developer tools (còn gọi là công cụ dành cho nhà phát triển) của trình duyệt bằng cách sử dụng tổ hợp phím F12 hoặc Ctrl + Shift + J nếu bạn sử dụng Firefox hoặc Chrome trên Windows hoặc Command + Option + J nếu bạn trên Mac OS. Sau đó trên cửa sổ Developer tools di chuyển tới tab Application => click vào mục Cookies => click chọn dòng đầu tiên với giá trị là địa chỉ URL của trang hiện tại trường hợp của bạn sẽ là http://localhost/test_session.php. Bạn sẽ thấy một bảng kết quả như sau:
Bảng kết quả này hiển thị danh sách thông tin các cookie của trang hiện được trình duyệt lưu lại. Trong đó cột đầu tiên Name là tên của cookie và cột thứ hai Value là giá trị tương ứng của cookie.
Khi bạn gọi hàm session_start() thì một cookie có tên là PHPSESSID được PHP tạo ra gửi trả về cho trình duyệt (và trình duyệt sẽ tự động lưu cookie này sau đó). Giá trị của cookie này chính là tên tập tin session mà PHP đã tạo ra khi xử lý request của trình duyệt gửi tới.
Okie điều này có nghĩa là trên server sẽ phải có một tập tin có tên tương ứng là pt9l3pa3q2jgkmagtrk19le9k1 trên server (tên này có thể khác trên máy bạn tùy thuộc vào giá trị của cookie PHPSESSID)? Chính xác là như vậy, bạn còn nhớ rằng ở phần trước tôi đã nhắc bạn nhớ địa chỉ đường dẫn lưu trữ file session trên server không? Bây giờ sẽ là lúc dùng tới nó. Bạn đi tới địa chỉ đường dẫn này và sẽ thấy một tập tin có tên sess_pt9l3pa3q2jgkmagtrk19le9k1 (Ở đây sess_ là prefix của tập tin để nhận biết tập tin này là PHP session).
Khi mở tập tin này bạn sẽ thấy nội dung như sau (bạn sẽ cần quyền admin nếu trên Windows hoặc root nếu trên Linux hoặc Mac OS X để có thể mở tập tin này):
test_key_1|s:12:"Test value 1";
Nội dung của tập tin này chứa giá trị session mà chúng ta đã lưu ở phần trước với cấu trúc được mã hóa (serialize).