Series PHP cURL Extension | Bài 1: "Giải ngố" cURL và Vòng đời của một HTTP Request
Chào anh em, nếu làm việc với Backend bằng PHP, chắc hẳn 99% anh em đã từng phải gọi API của một bên thứ ba (payment gateway, gửi SMS, fetch data từ microservice khác...). Để làm việc này trong PHP, chúng ta có nhiều cách, từ "cây nhà lá vườn" như file_get_contents() cho đến các thư viện hiện đại như Guzzle.
Nhưng đằng sau những thư viện hoành tráng đó, trái tim bơm máu cho các kết nối HTTP trong PHP chính là cURL Extension. Trong series này, chúng ta sẽ đi từ những khái niệm cốt lõi nhất đến những kỹ thuật "hardcore" như Multi cURL (bất đồng bộ) hay xử lý stream data. Hôm nay, ở bài đầu tiên, hãy cùng bóc tách bản chất của cURL và viết những dòng code đầu tiên.
1. cURL thực chất là gì?
cURL (Client URL) ban đầu là một command-line tool dùng để truyền tải dữ liệu qua các giao thức mạng (HTTP, HTTPS, FTP, SMTP...). Sức mạnh của cURL nằm ở bộ thư viện lõi libcurl – được viết bằng C, cực kỳ nhanh, ổn định và hỗ trợ hầu hết mọi chuẩn giao thức hiện nay.
PHP cURL Extension đơn giản là một lớp wrapper (vỏ bọc) giúp mã PHP của chúng ta có thể giao tiếp trực tiếp với thư viện libcurl bên dưới hệ điều hành.
Tại sao không dùng file_get_contents() cho nhanh? Nhiều anh em mới học thường dùng file_get_contents('https://api.example.com') vì nó ngắn. Nhưng ở production, đây là một rủi ro lớn:
- Performance: file_get_contents không tận dụng được kết nối liên tục (keep-alive).
- Timeout: Rất khó để quản lý timeout chính xác, dễ dẫn đến nghẽn process PHP nếu API đích bị treo.
- Tùy biến: Khó khăn khi muốn custom Headers, quản lý Cookies, hay xử lý các HTTP Status Code trả về.
cURL giải quyết triệt để tất cả những vấn đề trên.
2. Vòng đời 4 bước của một PHP cURL Request
Làm việc với cURL trong PHP giống hệt như quy trình bạn gọi điện thoại cho một người bạn. Nó luôn tuân theo 4 bước chuẩn mực:
- Khởi tạo (Init): Nhấc máy lên.
- Thiết lập thông số (Set Options): Bấm số điện thoại, chọn gọi video hay gọi thoại.
- Thực thi (Execute): Đợi đầu kia bắt máy và nói chuyện.
- Đóng kết nối (Close): Cúp máy để giải phóng tài nguyên.
3. Code thực hành: Lấy dữ liệu với GET Request
Hãy cùng viết một đoạn code chuẩn chỉ để fetch thông tin một User từ JSONPlaceholder (một fake API cho testing).
<?php
// Bước 1: Khởi tạo cURL session
// Tham số truyền vào là URL đích. Bạn cũng có thể set URL ở Bước 2.
$ch = curl_init('https://jsonplaceholder.typicode.com/users/1');
// Bước 2: Thiết lập các tùy chọn (Options)
// Đây là bước quan trọng nhất quyết định request của bạn sẽ hoạt động thế nào.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Trả về kết quả dưới dạng string thay vì in thẳng ra màn hình
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // Ép request phải hoàn thành trong 10 giây, tránh treo hệ thống
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Accept: application/json',
'User-Agent: PHP-cURL-Learning-Series'
]);
// Bước 3: Thực thi request và nhận kết quả
$response = curl_exec($ch);
// Kiểm tra lỗi trong quá trình thực thi (VD: sai URL, mất mạng, timeout)
if (curl_errno($ch)) {
echo "Lỗi cURL: " . curl_error($ch);
} else {
// Lấy HTTP status code để kiểm tra xem server trả về 200 OK hay lỗi 404, 500...
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode === 200) {
$userData = json_decode($response, true);
echo "Lấy dữ liệu thành công! Tên user là: " . $userData['name'];
} else {
echo "Server trả về mã lỗi: " . $httpCode;
}
}
// Bước 4: Đóng cURL session, giải phóng bộ nhớ
curl_close($ch);
?>
Giải ngố các Options cấu hình:
- CURLOPT_RETURNTRANSFER: Nếu không có dòng này, ngay khi gọi curl_exec(), dữ liệu sẽ tự động in toẹt ra trình duyệt (echo). Set thành true để lưu nó vào biến $response.
- CURLOPT_TIMEOUT: Luôn luôn phải có. Đừng bao giờ tin tưởng tuyệt đối vào tốc độ phản hồi của API bên thứ ba.
- CURLINFO_HTTP_CODE: Hàm curl_getinfo() là trợ thủ đắc lực giúp bạn lấy toàn bộ metadata của request (thời gian chạy, dung lượng tải, mã HTTP...).
Tổng kết
Ở bài viết này, chúng ta đã nắm được bản chất cURL là gì và làm quen với bộ khung 4 bước cơ bản nhất. Hãy tự gõ lại đoạn code trên và thử thay đổi URL thành một trang web không tồn tại để xem cách cURL bắt lỗi nhé.
Hẹn gặp lại anh em ở Bài 2, chúng ta sẽ đi sâu vào cách gửi dữ liệu lên server (POST Request), xử lý Form Data, JSON Payload và cách đính kèm File!
All Rights Reserved