一、curl_init簡介
curl_init()
是一個初始化curl會話的函數,返回的是一個curl資源句柄,我們可以通過這個句柄設置curl的參數,發起請求,獲取響應等操作。在php中使用curl完成http請求是非常方便的。
使用curl_init()
函數創建curl句柄後,需要通過curl_setopt()
設置各種參數,如請求的url、請求方式、請求頭信息等。然後使用curl_exec()
函數發送請求獲取響應。最後使用curl_close()
函數銷毀curl句柄。
二、基本使用示例
以下是一個簡單的使用curl發送HTTP GET請求的示例:
$url = 'http://example.com/api/get_user_info?id=123'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); var_dump($response);
在上面的示例中,首先定義了請求的url,然後使用curl_init()函數創建curl句柄,並調用curl_setopt()
函數設置了請求的url和返回response時是否直接輸出。最後使用curl_exec()
函數發送請求並獲取響應內容,最後銷毀curl句柄。
三、發起POST請求
使用curl發起POST請求也非常簡單,使用curl_setopt()
設置CURLOPT_POST
為true即可。如下面的示例:
$url = 'http://example.com/api/create_user'; $data = ['name' => 'jack', 'age' => 20]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $response = curl_exec($ch); curl_close($ch); var_dump($response);
上面的代碼中,定義了請求的url和請求的數據,使用curl_init()函數創建curl句柄,並使用curl_setopt()
函數設置了請求信息,包括url、是否直接輸出結果、是否為POST請求及請求的數據。使用curl_exec()
函數發送請求並獲取響應。最後銷毀curl句柄。
四、設置請求頭信息
在實際開發中,很多情況下需要設置請求頭信息,如請求接口需要設置Authorization token驗證信息。那麼我們可以使用curl_setopt()
函數設置請求頭信息,如下面的示例:
$url = 'http://example.com/api/get_user_info'; $headers = ['Authorization: Bearer xxxxxxxxxxxxxxxx']; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $response = curl_exec($ch); curl_close($ch); var_dump($response);
在上面的代碼中,定義了請求的url和請求頭信息,使用curl_init()函數創建curl句柄,並使用curl_setopt()
函數設置了請求信息,包括url、是否直接輸出結果、請求頭信息。最後使用curl_exec()
函數發送請求並獲取響應。最後銷毀curl句柄。
五、設置超時時間
在實際開發中,因為網絡的不確定性,很可能出現請求超時等情況。為了避免這種情況的發生,我們可以設置curl的請求超時時間,超過設定時間則會自動中斷請求。設置請求超時時間也很簡單,即使用curl_setopt()
函數設置CURLOPT_TIMEOUT
即可。如下面的示例:
$url = 'http://example.com/api/get_user_info'; $timeout = 5; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); $response = curl_exec($ch); curl_close($ch); var_dump($response);
在上面的代碼中,定義了請求的url和超時時間,使用curl_init()函數創建curl句柄,並使用curl_setopt()
函數設置了請求信息,包括url、是否直接輸出結果、超時時間。最後使用curl_exec()
函數發送請求並獲取響應。最後銷毀curl句柄。
六、設置Cookie
在一些業務場景中,需要使用Cookie來維持用戶的登錄狀態等信息。使用curl發送請求時設置Cookie也很方便,可以使用curl_setopt()
函數設置CURLOPT_COOKIE
即可。如下面的示例:
$url = 'http://example.com/api/get_user_info'; $cookie = 'session_id=xxxxxxxxxxxxx'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIE, $cookie); $response = curl_exec($ch); curl_close($ch); var_dump($response);
在上面的代碼中,定義了請求的url和Cookie信息,使用curl_init()函數創建curl句柄,並使用curl_setopt()
函數設置了請求信息,包括url、是否直接輸出結果、Cookie信息。最後使用curl_exec()
函數發送請求並獲取響應。最後銷毀curl句柄。
七、設置多個請求一起發送
有時候我們需要批量發送請求,而且不希望每個請求的響應都要等待上一個請求的響應到達才能繼續發下一個請求,此時我們可以使用curl_multi_init()
函數進行多個請求同時發起。如下面的示例:
$urls = [ 'http://example.com/api/get_user_info?id=1', 'http://example.com/api/get_user_info?id=2', 'http://example.com/api/get_user_info?id=3', ]; $ch_arr = []; $mh = curl_multi_init(); foreach ($urls as $url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_multi_add_handle($mh, $ch); $ch_arr[] = $ch; } do { curl_multi_exec($mh, $running); $info = curl_multi_info_read($mh); } while ($running > 0); foreach ($ch_arr as $ch) { $response = curl_multi_getcontent($ch); var_dump($response); curl_multi_remove_handle($mh, $ch); curl_close($ch); } curl_multi_close($mh);
以上代碼中定義了三個請求的url,然後使用curl_multi_init()
函數創建了一個curl批處理句柄,遍歷每個請求的url,使用curl_init()函數為每個請求創建curl句柄,並調用curl_setopt()
函數設置請求信息。使用curl_multi_add_handle()
函數將每個curl句柄加入curl批處理句柄,然後使用curl_multi_exec()
函數發送請求。使用curl_multi_info_read()
函數獲取curl執行情況的信息,將所有請求都執行完畢後,使用curl_multi_getcontent()
函數獲取每個請求的響應,並輸出。最後使用curl_multi_remove_handle()
函數將每個curl句柄從curl批處理句柄中刪除,並調用curl_close()
函數關閉curl句柄。最後使用curl_multi_close()
函數關閉curl批處理句柄。
八、結語
使用curl_init()
可以完成各種HTTP請求,能滿足我們的各種業務場景使用。使用curl發送HTTP請求的好處在於可以設置各種請求參數,如請求頭、請求體、請求超時時間等,使我們可以自由的控制請求行為。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/285827.html