Hướng dẫn dùng curl_setopt trong PHP

Bài trước chúng ta đã làm một ví dụ đơn giản sử dụng CURL để viết một ứng dụng đó là chạ một trang web khác, trong bài đó chúng ta có sử dụng hàm curl_setopt để thiết lập các thông số cấu hình cho CURL. Vậy thì trong bài này chúng ta sẽ tìm hiểu hàm này và các thông số truyền vào của nó nhé.

Hướng dẫn dùng curl_setopt trong PHP

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

1. Hàm curl_setopt trong CURL PHP

Cú phápbool curl_setopt ( resource $ch , int $option , mixed $value )

Trong đó:

  • $ch là object curl khi sử dụng hàm curl_init
  • $option là tên của thông số
  • $value là giá trị của thông số

Ví dụ

Bài viết này được đăng tại [free tuts .net]

// Tạo mới một CURL
$ch = curl_init();

// Cấu hình cho CURL
curl_setopt($ch, CURLOPT_URL, "https://freetuts.net/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// Thực thi CURL
curl_exec($ch);

// Ngắt CURL, giải phóng
$result = curl_close($ch);

// In kết quả ra màn hình
echo $result;

Trong ví dụ này mình có sử dụng hàm curl_setopt để cấu hình hai thông số đó là:

  • CURLOPT_URL: đường dẫn tới URL cần xử lý
  • CURLOPT_RETURNTRANSFER: nếu true thì sẽ trả kết quả về ở hàm curl_exec nên ta phải echo kết quả đó mới in lên trình duyệt, nếu false thì thực thi là nó in kết quả lên trình duyệt luôn

Trong ví dụ ở bài 1 mình không sử dụng thông số CURLOPT_RETURNTRANSFER nên không cần echo $result, còn ở đây vì có sử dụng nên phải echo.

2. Danh sách các thông số cấu hình của hàm curl_setopt PHP

Thật sự mà nói mình không thể liệt kê hết các thông số cấu hình cho hàm này được vì nó có quá nhiều, và thực tế thì mình cũng chưa bao giờ sử dụng hết các thông số đó nên cũng không dám liệt kê ra. Nếu bạn quan tâm thì hãy lên trang chủ của php.net bằng link này để xem thêm nhé.

Tuy nhiên ở các bài tiếp theo chúng ta sẽ làm các ví dụ và sẽ biết thêm được một số thông số cấu hình cho hàm curl_setopt nên các bạn yên tâm nhé. Cứ chờ đợi.

3. Lời kết

Bài 2 này cũng sẽ ngưng tại đây, lý do mình đã nói rồi vì các thông số quá nhiều  nên không thể  trình bày hết ra đây được. Chúng ta sẽ thực hành các ví dụ ở các bài tiếp theo và tôi sẽ ứng dụng một số thông số đặc trưng, hay sử dụng để các bạn làm quen, từ đó có thể mày mò thêm nhé.

Ở phần này bạn sẽ tìm hiểu cURL là gì? Cách thiết lập cURL để gửi đi một yêu cầu Request, sử dụng cURL GET, cURL POST và cURL POST dữ liệu JSON

cCurl PHP

cURL là một thư viện dùng để truyền dữ liệu trên mạng bằng một số giao thức như HTTP, FTP, HTTPS, POP3 ... . Nó ra đời từ năm 1997 viết bởi Daniel Stenberg, cơ bản nó là một thư viện viết bằng C. Trong hệ Linux nó có giao diện dòng lệnh, có thể sử dụng ngay đó là lệnh curl, ví dụ có thể tải về https://xuanthulab.net bằng lệnh

curl https://xuanthulab.net

Trong PHP có cung cấp các API để làm việc với thư viện này với các chức năng khá đầy đủ, đó là thư viện: Client URL Library, để sử dụng được các hàm Server cần có thư viện libcurl (mặc định có sẵn).

Bằng việc sử dụng cURL với PHP ta có thể truyền dữ liệu qua vài giao thức và hoạt động rất mạnh mẽ. Ví dụ gửi dữ liệu qua các website, xác thực oAuth, gọi API ...

Cơ bản về sử dụng cURL PHP

Trước khi gửi đi một yêu cầu nào đó (request), chúng ta cần tạo ra đối tượng cURL. Thật đơn giản chỉ việc gọi hàm curl_init($url), hàm này trả về một tài nguyên cURL. Trong đó tham số $url là địa chỉ gửi yêu cầu (tất nhiên có thể thiết lập lại sau khi đối tượng được tạo)

Ví dụ

$curl = curl_init(); //url = null

Thiết lập cURL

Ngay sau khi có được tài nguyên cURL bạn cần gán các thiết lập cho nó với hàm curl_setopt, cú pháp như sau:

bool curl_setopt(resource $resource_cURL,int $option, $value)

Trong đó $option là số nguyên chỉ ra loại thiết lập và $value là giá trị thiết lập, $resource_cURL là tài nguyên cURL tạo ra ban đầu. Dưới đây là danh sách các $option quan trọng nhất

Thiết lậpVí dụ/Diễn giải
CURLOPT_RETURNTRANSFER TRUE để khi gửi yêu cầu bằng hàm curl_exec() trả về chuỗi chứ không xuất thẳng ra màn hình.
CURLOPT_CONNECTTIMEOUT Thời gian cho phép cURL cố gắng kết nối (giây), 0 vô tận
CURLOPT_USERAGENT Nội dung của dòng User-Agent: trong header của HTTP khi gửi yêu cầu
CURLOPT_URL URL mà cCURL gửi yêu cầu
CURLOPT_POST TRUE - Thiết lập yêu cẩu gửi theo phương thức POST, kiểu POST application/x-www-form-urlencoded sử dụng POST FORM thông thường trong HTML
CURLOPT_POSTFIELDS Mảng dữ liệu để POST

Ngoài ra còn vô số thiết lập khác, có thể tham khảo: curl-setopt

Ví dụ

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://xuanthulab.net/apitest/');

Bạn có thi hành nhiều thiết lập một lúc bằng hàm curl_setopt_array() ví dụ:

//Dữ liệu để POST
$data = array(
    'name' = 'foo',
    'data' = array(1,2,3,4),
    'value' = 'bar'
);

//Có thể phải dùng thêm hàm chuyển tham số mảng thành chuỗi URL encode
//$data = http_build_query($data) nếu POST

$curl = curl_init();
$options =array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => 'https://xuanthulab.net/apitest/',
    CURLOPT_POST => true,
    CURLOPT_USERAGENT => "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)",
    CURLOPT_POSTFIELDS => $data
 );
curl_setopt_array($curl, $options);

Gửi yêu cầu với cURL

Sau khi tạo ra tài nguyên cURL và thiết lập như trên, tiến hành gửi yêu cầu với cURL bằng hàm curl_exec(). Kết quả trả về false nếu thất bại, true nếu thành công hoặc giá trị là chuỗi trả về khi CURLOPT_RETURNTRANSFER thiết lập true.

$curl = curl_init();
//... other code setting ...
$result = curl_exec($curl);
if ($result === FALSE) {
    echo "Lỗi cCURL";
} else {
    //Thành công, kết quả trong $result
}

$result trả về có thể là JSON, string ... tùy thuộc vào server bạn gửi yêu cầu

Đóng kết nối cURL

Nên nhớ sau khi kết nối, gửi yêu cầu thành công, nhận hết giá trị trả về bạn cần đóng cCURL bằng hàm curl_close($curl);

Ví dụ sử dụng cCURL GET

Ví dụ sau sử dụng cURL PHP gọi theo phương thức GET lấy dữ liệu JSON tìm kiếm trên http://github.com các Repo (kho chứa) theo từ khóa google

 0,
    CURLOPT_URL => 'https://api.github.com/search/repositories?q=google',
    CURLOPT_USERAGENT => 'XuanThuLab test cURL Request',
    CURLOPT_SSL_VERIFYPEER => false
));

$resp = curl_exec($curl);

//Kết quả trả tìm kiếm trả về dạng JSON
$weather = json_decode($resp);

var_dump($weather); // dump kết quả

curl_close($curl);

Ví dụ sử dụng cCURL POST

Ví dụ sau sử dụng dịch vụ chạy thử REST ở địa chỉ https://reqres.in/api/register để thử POST đăng nhập hệ thống. Thông tin đăng nhập gồm email và passowrd. Bạn chạy thử, thử thay cả email khác.

$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => 'https://reqres.in/api/register',
    CURLOPT_USERAGENT => 'XuanThuLab Exmaple POST',
    CURLOPT_POST => 1,
    CURLOPT_SSL_VERIFYPEER => false, //Bỏ kiểm SSL
    CURLOPT_POSTFIELDS => http_build_query(array(
        'email' => '[email protected]',
        'password' => 'pistol'
    ))
));
$resp = curl_exec($curl);

var_dump($resp);

curl_close($curl);

Sử dụng cCURL post dữ liệu JSON

Rất nhiều dịch vụ Webservice ví dụ của Google, Facebook ... sử dụng REST post JSON để làm việc, chứ không hẳn là POST kiểu như FORM HTML post lên, trong trường hợp này thực hiện các bước

  • Mảng dữ liệu POST phải chuyển thành chuỗi json với hàm json_encode
  • Thiết lập thêm CURLOPT_HTTPHEADER với kiểu application/json
  • Thiết lập thêm CURLOPT_CUSTOMREQUEST là POST, PUT ... tùy thuộc dịch vụ

Ví dụ

$data = array("name" => "Hagrid", "age" => "36");
$data_string = json_encode($data);

$curl = curl_init('http://example.api.com');

curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen($data_string))
);

$result = curl_exec($curl);
curl_close($curl);

Ví dụ sử dụng dịch vụ Google URL Shortener

Dịch vụ này của Google gọi là dịch vụ rút gắn link, một đường link dài rút ngắn lại để chia sẻ. Giờ bạn dùng cURL để truy cập dịch vụ này nhằm lấy link ngắn của một URL dài.

Trước tiên bạn vào Google Cloud Console tạo một ứng dụng riêng để truy cập các dịch vụ Google.

Sau đó vào Google URL Shortener bấm vào GET KEY để lấy key truy cập dịch vụ này.

Dịch vụ Google URL Shortener đã bị dừng cung cấp bởi Google, nên thời điểm này nó không còn hoạt động, tuy nhiên ý nghĩa code bạn vẫn có thể tham khảo

Đoạn mã đầy đủ

$googleapikey = "KEY_TRUY_CẬP_DỊCH_VỤ";
$longurl =
  "https://xuanthulab.net/gop-file-thu-vien-trong-php-voi-include-va-require.html";


$data = array(
        "longUrl" =>$longurl
);

$data_string = json_encode($data);

$curl = curl_init(
    'https://www.googleapis.com/urlshortener/v1/url?key='.$googleapikey);

curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Content-Length: ' . strlen($data_string))
);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

$result = curl_exec($curl);

$shorkey = json_decode($result);

echo "SHORT URL: ".$shorkey->id;

curl_close($curl);