php的curl可以实现模拟http的各种请求,这也是php做网络爬虫的基础,也多用于接口api的调用。 PHP 支持 Daniel Stenberg 创建的 libcurl 库,能够连接通讯各种服务器、使用各种协议。libcurl 目前支持的协议有 http、https、ftp、gopher、telnet、dict、file、ldap。 libcurl 同时支持 HTTPS 证书、HTTP POST、HTTP PUT、 FTP 上传(也能通过 PHP 的 FTP 扩展完成)、HTTP 基于表单的上传、代理、cookies、用户名+密码的认证。
curl_init()
curl_setopt().有一长串CURL 参数可供设置,它们能指定URL请求的各个细节。
三个重要的选项
CURLOPTURL:指定请求的URL; CURLOPTRETURNTRANSFER: 设置为1表示稍后执行的curlexec函数的返回是URL的返回字符串,而不是把返回字符串定向到标准输出并返回TRUE; CURLLOPTHEADER:设置为0表示不返回HTTP头部信息 详细查看 php官网 https://www.php.net/manual/zh/function.curl-setopt.php
curl_exec()
curl_close()
curl_errno: 返回最后一次错误码,php已经定义了诸多错误枚举编码
curl_errror:返回一个保护当前会话最近一次错误的字符串
curlgetinfo:使用curlgetinfo()函数获取CURL请求输出的相关信息,以下是相关信息:
url:网络地址。 contenttype:内容编码。 httpcode:HTTP状态码。 headersize:header的大小。 requestsize:请求的大小。 filetime:文件创建的时间。 sslverifyresult:SSL验证结果。 redirectcount:跳转计数。 totaltime:总耗时。 namelookuptime:DNS查询耗时。 connecttime:等待连接耗时。 pretransfertime:传输前准备耗时。 sizeuplpad:上传数据的大小。 sizedownload:下载数据的大小。 speeddownload:下载速度。 speedupload:上传速度。 downloadcontentlength:下载内容的长度。 uploadcontentlength:上传内容的长度。 starttransfertime:开始传输的时间表。 redirect_time:重定向耗时。
例如
$info = curl_getinfo($sh);echo ' 获取 '.$info['url'].'耗时'.$info['total_time'].'秒';
/** * Created by 沙蒿. * @desc curl请求封装 * @param string $url 请求地址:https * @param string $type 请求方式:get/post * @param string $res 返回格式:json * @param array $arr 请求参数 * @return mixed|string */ public function httpsCurl($url = '', $type = 'get', $res = 'json', $arr = []) { $curl = curl_init(); if ($type == 'post') { curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $postArr = urldecode(json_encode($arr)); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $postArr); } else { $getArr = ''; foreach ($arr as $key => $value) { $getArr .= "$key=".urlencode($value)."&"; } $url = substr($url.'?'.$getArr, 0, -1); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); } $output = curl_exec($curl); curl_close($curl); if ($res == 'json') { if (curl_errno($curl)) { return curl_error($curl); } else { return json_decode($output, true); } } }