Cookie và Session trong PHP: Hướng Dẫn Chi Tiết Từ A Đến Z

Bài viết này sẽ cung cấp cho bạn kiến thức toàn diện về Cookie và Session trong PHP, từ khái niệm cơ bản, cách thiết lập, sử dụng, đến việc xóa và ứng dụng chúng trong thực tế.

Cookie trong PHP

Cookie là một đoạn dữ liệu nhỏ được lưu trữ trên máy tính của người dùng bởi trình duyệt web. Cookie thường được sử dụng để theo dõi hoạt động duyệt web, lưu trữ thông tin đăng nhập, hoặc cá nhân hóa trải nghiệm người dùng.

Ví dụ về cách cookie hoạt động để ghi nhớ tên người dùng:

  1. Máy chủ web gửi một cookie (ví dụ: username=JohnDoe) đến trình duyệt của người dùng.
  2. Trình duyệt lưu trữ cookie này.
  3. Khi người dùng truy cập lại trang web đó, trình duyệt sẽ tự động gửi cookie trở lại máy chủ.
  4. Máy chủ nhận cookie và có thể nhận ra người dùng là JohnDoe.

Quan trọng cần lưu ý: Cookie được lưu trữ trên trình duyệt và tự động gửi đến máy chủ mỗi khi người dùng truy cập vào một trang web thuộc cùng miền.

Thiết lập Cookie

Trong PHP, bạn có thể thiết lập cookie bằng hàm setcookie(). Hàm này phải được gọi trước bất kỳ mã HTML nào được xuất ra trình duyệt.

setcookie(string $name, string $value = "", int $expires = 0, string $path = "", string $domain = "", bool $secure = false, bool $httponly = false): bool
  • $name: Tên của cookie. Tên này được sử dụng để truy cập cookie thông qua biến $_COOKIE.
  • $value: Giá trị của cookie.
  • $expires: Thời gian hết hạn của cookie (timestamp Unix). Sau thời gian này, cookie sẽ bị xóa khỏi trình duyệt. Nếu giá trị là 0, cookie sẽ bị xóa khi trình duyệt đóng. Bạn có thể sử dụng hàm time() để lấy timestamp hiện tại.
  • $path: Đường dẫn trên máy chủ mà cookie có hiệu lực. Sử dụng / để cookie có hiệu lực trên toàn bộ tên miền.
  • $domain: Tên miền mà cookie có hiệu lực.
  • $secure: Nếu là true, cookie chỉ được truyền qua kết nối HTTPS.
  • $httponly: Nếu là true, cookie chỉ có thể được truy cập thông qua giao thức HTTP, không thể truy cập bằng JavaScript. Điều này giúp tăng cường bảo mật.

Ví dụ:

<?php
$ten_cookie = "user";
$gia_tri_cookie = "SenTayHo";
setcookie($ten_cookie, $gia_tri_cookie, time() + (86400 * 30), "/"); // Hết hạn sau 30 ngày
?>

Đoạn mã trên thiết lập một cookie với tên user, giá trị SenTayHo, và thời gian hết hạn là 30 ngày.

Bạn có thể kiểm tra bằng cách chạy lệnh:

php -S 0.0.0.0:8080

Sau đó truy cập địa chỉ http://localhost:8080 để kiểm tra. Sử dụng các công cụ dành cho nhà phát triển của trình duyệt (ví dụ: Chrome DevTools) để xem các cookie đã được thiết lập.

phpphp

Khi truy cập, header trả về sẽ có thông tin về thiết lập Cookie. Ngược lại, nếu đã có Cookie, trình duyệt sẽ gửi thông tin này trong header của request.

Bạn cũng có thể sử dụng lệnh curl để xem header trả về:

phpphp

Truy cập Cookie

Để truy cập thông tin cookie do trình duyệt gửi lên, bạn sử dụng biến $_COOKIE, đây là một mảng chứa tất cả các cookie. Nên sử dụng hàm isset() để kiểm tra xem cookie có tồn tại hay không trước khi truy cập.

Ví dụ:

<?php
if(isset($_COOKIE["user"])) {
  echo "Chào mừng " . $_COOKIE["user"] . "!";
} else {
  echo "Chào khách!";
}
?>

Xóa Cookie

Để xóa một cookie, bạn sử dụng hàm setcookie() với thời gian hết hạn đã qua.

Ví dụ:

<?php
setcookie("user", "", time() - 3600);
?>

Đoạn mã trên sẽ xóa cookie có tên là user bằng cách đặt thời gian hết hạn về một giờ trước.

Session trong PHP

Session là một cách để lưu trữ thông tin về người dùng trên máy chủ. Session thường được sử dụng để lưu trữ thông tin đăng nhập, giỏ hàng, hoặc các tùy chọn cá nhân hóa của người dùng.

Session giúp bạn trao đổi dữ liệu giữa các trang (giữa 2 request). Ví dụ, sau khi người dùng đăng nhập, thông tin đăng nhập cần được lưu lại để các trang khác nhau trong phiên làm việc có thể truy cập mà không cần đăng nhập lại mỗi lần. Tương tự, khi người dùng thêm sản phẩm vào giỏ hàng, thông tin này cần được lưu trữ để chuyển đến trang thanh toán.

Session là thông tin về phiên làm việc cho từng khách truy cập. Trong PHP, thông tin này được lưu trữ trong một file tạm trên máy chủ (thư mục được cấu hình trong php.ini với tham số session.save_path). Mỗi khách truy cập sẽ có một session riêng, được xác định bằng một ID duy nhất.

Quá trình hoạt động của session có thể tóm tắt như sau:

  1. Khi khách truy cập lần đầu, PHP tạo ra một định danh duy nhất (session ID) cho khách đó. Định danh này là một chuỗi ngẫu nhiên.
  2. Một cookie có tên PHPSESSID (chứa session ID) được gửi đến trình duyệt của khách và được trình duyệt lưu giữ.
  3. Mỗi khi trình duyệt truy cập lại trang web, nó sẽ gửi cookie PHPSESSID trở lại máy chủ.
  4. PHP sử dụng session ID này để phục hồi dữ liệu session từ file tương ứng trên máy chủ.
  5. Session sẽ bị hủy khi trình duyệt đóng lại hoặc khi hết thời gian chờ (timeout) được cấu hình trên máy chủ.

Để session hoạt động, trình duyệt cần hỗ trợ cookie. Nếu cookie bị chặn, session có thể không hoạt động đúng cách. Ví dụ, nếu bạn chặn cookie từ Facebook, bạn sẽ không thể đăng nhập được vào Facebook.

Bắt đầu Session

Để bắt đầu sử dụng session trong PHP, bạn cần gọi hàm session_start(). Hàm này sẽ phục hồi dữ liệu session nếu đã có, hoặc tạo một session mới nếu chưa tồn tại. Nên gọi hàm này ở đầu trang, trước bất kỳ mã HTML nào.

Một cách khác là cấu hình PHP để tự động bắt đầu session bằng cách đặt session.auto_start = 1 trong php.ini.

<?php
session_start();
?>

Khi session được bắt đầu, PHP sẽ gửi một cookie với tiền tố PHPSESSID về trình duyệt. Bạn có thể thay đổi tiền tố này trong php.ini bằng cách sửa đổi tham số session.name.

phpphp

Lưu trữ và Truy xuất Dữ liệu Session

Biến toàn cục $_SESSION (kiểu mảng) là nơi session lưu trữ thông tin. Bạn có thể truy cập biến này trong suốt vòng đời của session để lưu trữ và truy xuất dữ liệu. Nên sử dụng hàm isset() để kiểm tra xem một biến session đã tồn tại hay chưa trước khi truy cập.

Ví dụ, đoạn code sau sử dụng session để đếm số lần một khách truy cập vào website:

<?php
session_start();

if (isset($_SESSION['counter'])) {
    $_SESSION['counter'] += 1;
} else {
    $_SESSION['counter'] = 1;
}

$msg = "<p>Bạn đã truy cập " . $_SESSION['counter'] . " lần vào trang này.</p>";
echo $msg;
?>

Khi chạy session, dữ liệu trả về cho trình duyệt sẽ bao gồm một mẩu tin nhỏ ở phần header, đây là cookie liên quan đến ID của session. Trình duyệt sẽ lưu trữ cookie này và gửi nó đến server trong các request tiếp theo, cho phép PHP phục hồi session.

Hủy Session

Bạn có thể hủy một biến hoặc toàn bộ session:

  • Để hủy một biến trong session, sử dụng lệnh unset(): unset($_SESSION['counter']);
  • Để hủy toàn bộ session, sử dụng lệnh session_destroy(): session_destroy();

Nắm vững Cookie và Session là cơ sở để xây dựng các hệ thống như đăng nhập người dùng, giỏ hàng, đặt hàng, v.v.