1. curl简介
发起http/https请求,多用于接口调用,文件上传等场景。
2. 相关函数
function curl() { // 初始化 $ch = curl_init(); // 配置 curl_setopt($ch, CURLOPT_URL, "http://www.baidu.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 执行 $output = curl_exec($ch); // 判断错误 if ($code = curl_errno($ch)) { echo 'Curl errorno: ' . $code . "\n\r"; echo 'Curl error: ' . curl_error($ch); } // 关闭 curl_close($ch); // print_r($output); }
请求主要包括四个步骤:初始化连接 -> 配置参数 -> 发起请求 ->关闭连接
主要涉及到的函数分别对应:①curl_init() -> ②curl_setopt() -> ③curl_exec() -> ④curl_close()
请求发生错误时,⑤curl_errno() 和 ⑥curl_err() 可以获取错误码 和 错误信息
3. get请求的实现
同上demo
4. post请求的实现
①json格式
function postJson() { // 初始化 $ch = curl_init(); // 设置请求地址 curl_setopt($ch, CURLOPT_URL, "example.com"); // 获取返回结果 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置请求头 curl_setopt($ch, CURLOPT_HEADER, ["Content-Type: application/json"]); // 设置post请求 curl_setopt($ch, CURLOPT_POST, TRUE); // 设置请求参数 $data = ["param1" => "value1"]; curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); // 执行 $output = curl_exec($ch); // 判断错误 if($code = curl_errno($ch)) { echo 'Curl errorno: ' . $code . "\n\r"; echo 'Curl error: ' . curl_error($ch); } // 关闭 curl_close($ch); // print_r($output); }
②application/x-www-form-urlencoded格式
function postForm() { // 初始化 $ch = curl_init(); // 设置请求地址 curl_setopt($ch, CURLOPT_URL, "example.com"); // 获取返回结果 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置请求头 curl_setopt($ch, CURLOPT_HEADER, ["Content-Type: application/x-www-form-urlencoded"]); // 设置post请求 curl_setopt($ch, CURLOPT_POST, TRUE); // 设置请求参数 $data = ["param1" => "value1"]; curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); // 执行 $output = curl_exec($ch); // 判断错误 if($code = curl_errno($ch)) { echo 'Curl errorno: ' . $code . "\n\r"; echo 'Curl error: ' . curl_error($ch); } // 关闭 curl_close($ch); // print_r($output); }
③form-data格式()
function postFormDefault() { // 初始化 $ch = curl_init(); // 设置请求地址 curl_setopt($ch, CURLOPT_URL, "example.com"); // 获取返回结果 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置post请求 curl_setopt($ch, CURLOPT_POST, TRUE); // 设置请求参数 $data = ["param1" => "value1"]; curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // 执行 $output = curl_exec($ch); // 判断错误 if($code = curl_errno($ch)) { echo 'Curl errorno: ' . $code . "\n\r"; echo 'Curl error: ' . curl_error($ch); } // 关闭 curl_close($ch); // print_r($output); }
5. 常用OPTION介绍
①CURLOPT_URL 请求地址
②CURLOPT_HTTPHEADER 请求头
③CURLOPT_POST 是否是POST请求
④CURLOPT_POSTFIELDS 请求内容
⑤CURLOPT_RETURNTRANSFER curl_exec()可以获取结果
⑥CURLOPT_COOKIEJAR 记录cookie到指定文件中
⑦CURLOPT_COOKIEFILE 使用指定文件的cookie
⑧CURLOPT_PROXY 代理地址
⑨CURLOPT_PROXYPORT 代理端口
⑩CURLOPT_HEADER 返回响应头信息
6. 批量请求
①相关函数
$mh = curl_multi_init() 初始化
curl_multi_add_handle($mh, $ch) 添加句柄 ,$ch为设置好的单个请求的句柄
curl_multi_exec($mh, $running) 执行请求
curl_multi_remove_handle($mh, $ch) 移除句柄
curl_multi_close($mh) 关闭链接
curl_multi_getcontent($ch) 逐个获取结果
②demo
function actionCurlMulti() { //获取每个请求的句柄 $ch1 = getCh("http://example1.com", ["param" => "value"]); $ch2 = getCh("http://example2.com", ["param" => "value"]); $ch3 = getCh("http://example3.com", ["param" => "value"]); //添加句柄 $mh = curl_multi_init(); curl_multi_add_handle($mh, $ch1); curl_multi_add_handle($mh, $ch2); curl_multi_add_handle($mh, $ch3); //发起请求 //running表示执行执行中的请求 $running = 0; do { usleep(10000); curl_multi_exec($mh,$running); } while ($running > 0); //移除句柄 curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_remove_handle($mh, $ch3); //关闭链接 curl_multi_close($mh); //分别获取结果 $res1 = curl_multi_getcontent($ch1); $res2 = curl_multi_getcontent($ch2); $res3 = curl_multi_getcontent($ch3); print_r($res1 . "\r\n"); print_r($res2 . "\r\n"); print_r($res3 . "\r\n"); } function getCh($url, $params) { $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_COOKIEJAR, "cookie.txt"); curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt"); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params)); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Content-Type: application/json", "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36" ]); return $ch; }
7. 文件上传
function uploadFile() { // 初始化 $ch = curl_init(); // 设置请求地址 curl_setopt($ch, CURLOPT_URL, "example.com"); // 获取返回结果 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置post请求 curl_setopt($ch, CURLOPT_POST, TRUE); // 设置文件 $data = ["file" => new \CURLFile("test.jpg")]; curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // 执行 $output = curl_exec($ch); // 判断错误 if($code = curl_errno($ch)) { echo 'Curl errorno: ' . $code . "\n\r"; echo 'Curl error: ' . curl_error($ch); } // 关闭 curl_close($ch); // print_r($output); }