在 PHP 开发中,CURL(Client URL Library)是一个非常强大且常用的工具,它允许我们与各种网络资源进行交互,如发送 HTTP 请求、获取网页内容、上传文件等。本文将详细介绍 PHP 中 CURL 库的详细使用方法 。和python里面的该库作用是类似的。这里主要是以PHP为载体进行全方位的总结使用。 该库在编程里面使用的频率非常高,基本应用里面,除了对MYSQL的交互,就是对远程API的获取,可以理解为第二使用的库。没有mysql的php基本比较废,而没有CURL也同样
$curl = curl_init(); //初始化资源
这里理解下PHP里面资源的定义概念:在 PHP 中,“资源” 是一种特殊的数据类型。资源是由外部程序(如数据库连接、文件句柄、图像操作句柄等)创建和管理的数据。资源并不是像整数、字符串、数组等那样的具体数据值,而是指向外部资源的引用或标识符。例如,使用 fopen()
函数打开一个文件时,它会返回一个文件资源,可以使用这个资源来进行后续的文件读取、写入等操作。再比如,连接到数据库时,返回的数据库连接对象也是一种资源。资源通常需要通过特定的函数来进行操作和释放,以避免资源泄漏。当不再需要使用资源时,应该使用相应的函数(如 fclose()
关闭文件资源、关闭数据库连接等)来释放资源。
资源是和int boolen float object 一样被定义的类型 ,在常用的编程里面,很少会有资源类型的概念,而curl_init就是打开一个初始化的资源。
请求参数的配置
curl_setopt($curl, CURLOPT_URL, "http://example.com"); //链接
curl_setopt($curl, CURLOPT_POST, true); // 发送post 请求 默认不设置就是get直接获取
$data = ['key1' => 'value1', 'key2' => 'value2']; //相关数据
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));//如果是post方式 发送数据 这是请求的参数
$headers = ['Content-Type: application/json'];
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); //设置请求头信息,也就是我们平时说的请求头
curl_setopt($curl, CURLOPT_TIMEOUT, 10); //请求超时,特别是请求境外的时候,很容易超时 这个很重要,如果是正式开发里面,对远程异常的请求忍受上限是5秒,拿不到结果直接报错,已经严重影响业务的运行
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //如果是true 返回的变量里面,false 直接输出。如果我们需要处理里面的相关字符串,需要设置为true 如果我们只是单纯的转发静态网页内容,可以设置为false,直接返回出来
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //是否验证证书,如果是请求支付宝相关的链接,需要验证数字证书,默认只是请求内容,可不建立安全链接 不用证书居多,使用证书需要部署证书的路径
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"); //请求里面的user-Agent 一般PHP里面都是请求自己的合法的链接,对这个伪装性要求不高,如果需要伪装,使用python更方便一些
curl_setopt($ch,CURLOPT_HEADER, 1);// 设置获取响应头 curl默认是没有获取响应头的,和python不一样
更详细的参数,需要去查看该参数手册,上述是一些开发里面用到的参数配置
$response = curl_exec($ch); //参数相关配置好之后,发出请求 这样就获取到页面请求的结果
curl_close($ch); //一般请求完成这个页面之后,我们需要关闭释放该资源,减少内存的相关消耗
如果业务是顺畅的, 我们是不用知道错误请求码,但是如果是请求异常,我们就需要对错误码进行逻辑分离。而这个是解决问题的关键,基本上怎么处理错误(90%以上的逻辑都是正确的,但是遇到10%的错误请求,会让我们系统瘫痪,所以重点是监测请求,在开发里面,对这个错误的监测不重视,吃过大亏)。
if ($response === false) { //请求异常需要进入日志记录
$errorCode = curl_errno($ch); //我们拿到的错误码 是数字,
echo "CURL 错误码: ". $errorCode. "\n";
}
相关错误码
1. `CURLE_OK` (0): 表示操作成功,没有错误。
2. `CURLE_UNSUPPORTED_PROTOCOL` (1): 不支持的协议。
3. `CURLE_FAILED_INIT` (2): 初始化失败。
4. `CURLE_URL_MALFORMAT` (3): URL 格式错误。
5. `CURLE_COULDNT_RESOLVE_PROXY` (5): 无法解析代理服务器。
6. `CURLE_COULDNT_RESOLVE_HOST` (6): 无法解析主机。
7. `CURLE_COULDNT_CONNECT` (7): 无法连接到主机或代理。
8. `CURLE_OPERATION_TIMEDOUT` (28): 操作超时。
9. `CURLE_SSL_CONNECT_ERROR` (35): SSL 连接错误。
拓展使用需求: (获取更详细的响应设置)
curl_getinfo 函数可以获取以下一些常见的参数信息:
CURLINFO_EFFECTIVE_URL:获取最终实际请求的 URL 。
CURLINFO_HTTP_CODE:获取 HTTP 响应状态码。
CURLINFO_TOTAL_TIME:获取整个请求所花费的总时间(包括 DNS 解析、连接建立、数据传输等),以秒为单位。
CURLINFO_NAMELOOKUP_TIME:获取 DNS 解析所花费的时间,以秒为单位。
CURLINFO_CONNECT_TIME:获取连接建立所花费的时间,以秒为单位。
CURLINFO_PRETRANSFER_TIME:获取从开始到准备传输所花费的时间,以秒为单位。
CURLINFO_SIZE_UPLOAD:获取上传的数据大小,以字节为单位。
CURLINFO_SIZE_DOWNLOAD:获取下载的数据大小,以字节为单位。
CURLINFO_SPEED_DOWNLOAD:获取下载速度,以字节 / 秒为单位。
CURLINFO_SPEED_UPLOAD:获取上传速度,以字节 / 秒为单位
示例使用:
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); //HTTP代码的使用相对比较频繁 状态码属于常用判断
基本上日常使用的请求远程网络页面,还有常见的协议基本使用到这些设置。可以完成URL的响应监测,远程接口数据获取,DNS响应速度获取,判断主机是否还存在(判断网络域名有效的关键)。