curl
curl_init()初始化 → curl_setopt()配置请求参数 → 执行请求curl_exec() → curl_getinfo() 获取请求信息→ curl_close() 释放资源
```
function get($url)
{
$ch = curl_init();
-
curl_setopt(ch, CURLOPT_URL, url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
output = curl_exec(ch);
httpCode = curl_getinfo(ch, CURLINFO_HTTP_CODE);
if($httpCode == 404) {
return 404;
}
curl_close($ch);
return $output;
}
```
curl_init()
**PHP-CURL 扩展的入口函数**,是发起所有 CURL 网络请求的**第一步、必用步**,没有它就无法使用 CURL 的任何功能。
✅ 核心作用
✅ 初始化一个全新的 **CURL 会话句柄(CURL handle)**,创建 CURL 操作的「核心容器」;
✅ 为后续的 `curl_setopt()`(配置请求)、`curl_exec()`(执行请求)、`curl_close()`(关闭请求)提供**唯一操作标识**;
✅ 申请并占用对应的系统资源,承载整个 CURL 请求的所有配置、状态、响应数据。
写法1:无参数 → 初始化空的CURL会话(最常用,URL后续用curl_setopt(ch, CURLOPT_URL, url)配置)
```
resource curl_init ( void )
```
写法2:带参数 → 初始化时直接指定请求的URL
```
resource curl_init ( string $url = null )
```
✅ 写法 1:无参数初始化
```
<?php
// 1. 初始化空的CURL会话,得到句柄$ch
$ch = curl_init();
// 2. 后续通过curl_setopt()单独配置请求URL(核心优势:灵活)
curl_setopt($ch, CURLOPT_URL, 'https://www.baidu.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 3. 执行+关闭
output = curl_exec(ch);
curl_close($ch);
?>
```
✅ 优势(为什么推荐)
✅ 分离「初始化」和「配置 URL」,当 URL 需要**动态拼接、条件变更**时,修改更方便;
✅ 符合 CURL「初始化→配置→执行→关闭」的标准流程,代码可读性更强;
✅ 适配多配置场景(如同时配置超时、HTTPS、请求头),扩展性更好。
✅ 写法 2:初始化时直接传 URL(简化写法)
```
<?php
// 1. 初始化的同时,直接指定请求URL
$ch = curl_init('https://www.baidu.com');
// 2. 无需再配置CURLOPT_URL,直接配置其他参数
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 3. 执行+关闭
output = curl_exec(ch);
curl_close($ch);
?>
```
✅ 适用场景
✅ 简单请求场景:URL 固定不变、无需额外复杂配置,一行完成初始化 + 指定 URL,代码更简洁;
✅ 快速测试场景:临时发起单个 GET 请求,追求代码精简。
危害:`curl_init()` 会占用服务器的**内存、文件描述符**等系统资源,若大量请求未关闭句柄,会导致服务器资源耗尽,程序卡死 / 报错;所以要及时关闭。
curl_setopt()
PHP-CURL 扩展中 **最核心、最常用** 的函数,没有之一;它是承接 `curl_init()`(初始化)和 `curl_exec()`(执行)的**桥梁函数**。
专门为**已初始化的 CURL 句柄**(`curl_init()`返回的`$ch`)**设置单个请求配置项**,可以理解为:给你的 CURL 请求「定制规则、配置参数」。
小到指定请求 URL、设置返回模式,大到配置超时、HTTPS 兼容、请求头、POST 数据,**所有 CURL 的请求规则都靠它来定义**。
你的`get()`函数能实现「获取响应内容、不直接输出」的核心效果,完全依赖`curl_setopt()`的配置。
```
bool curl_setopt ( resource ch , int option , mixed $value )
```
| 参数名 | 类型 | 必传 | 核心作用 & 你的代码对应示例 |
| ------- | -------- | --- | ------------------------------------------------------------------- |
| ch \| resource \| 是 \| \*\*CURL 句柄\*\*:\`curl_init()\`返回的资源变量(你的代码中就是\`ch`),表示「要给哪个 CURL 请求配置参数」 |
| $option | int | 是 | **配置选项常量**:PHP 内置的、以`CURLOPT_`开头的常量(如`CURLOPT_URL`),表示「要配置哪一项规则」 |
| value \| mixed \| 是 \| \*\*配置值\*\*:对应\`option`的具体取值(字符串 / 数字 / 布尔值),表示「这项规则要配置成什么样子」 |
✅ 返回值说明
-
✅ 配置**成功** → 返回布尔值 `true`;
-
❌ 配置**失败** → 返回布尔值 `false`(极少出现,仅`ch\`无效 /\`option`不存在时触发)。
> ✅ 关键提醒:一个`curl_setopt()`**只能设置一个配置项**,要配置多个规则,就需要**多次调用**(你的代码中就是调用 2 次,配置 2 个规则)。
例如:
指定请求的目标 URL
```
// 你的代码原句 curl_setopt(ch, CURLOPT_URL, url);
```
各参数对应解析
-
`$ch`:当前初始化好的 CURL 请求句柄;
-
`CURLOPT_URL`:配置选项常量 → 含义是「设置 CURL 请求的目标 URL 地址」;
-
`$url`:你的函数入参 → 要请求的百度 / 接口地址(字符串类型)。
作用
这行代码的唯一目的:**告诉 CURL,你要请求哪个网址**,是所有 CURL 请求的「必配项」。
curl_exec()
PHP-CURL 扩展的 **执行核心函数**,是 CURL 请求链路中「承上启下的最终执行环节」,也是你之前代码中发起**实际网络请求**的关键函数。
执行**已完成初始化 + 参数配置**的 CURL 会话句柄(`curl_init()`创建 + `curl_setopt()`配置的`$ch`),**真正发起网络请求**;
向目标 URL 发送请求、接收服务器响应,并根据`curl_setopt()`的配置规则,返回 / 输出响应结果;
是 CURL 请求链路中,**唯一触发实际网络通信**的函数,没有它,所有`curl_init()`和`curl_setopt()`的配置都只是「纸上谈兵」。
✅ 通俗理解:`curl_init()` = 打开浏览器、`curl_setopt()` = 输入网址 + 设置浏览器参数、`curl_exec()` = **按下回车,访问目标页面**。
```
mixed curl_exec ( resource $ch )
```
| 参数 | 类型 | 是否必填 | 核心说明 | 代码对应 |
| --- | -------- | ---- | ------------------------------------------------------- | ------------ |
| ch \| resource \| 是 \| 由\`curl_init()\`返回的\*\*有效 CURL 句柄\*\*,包含了所有请求配置(URL、返回模式、超时等) \| 代码中直接传入\`ch` |
✅ 返回值规则(重中之重,和你的代码强绑定)
`curl_exec()`的返回值**完全由你之前配置的 `CURLOPT_RETURNTRANSFER` 决定**,这是两个函数最核心的联动关系,也是你代码能正常工作的关键,分 2 种核心情况,必须死记:
✔️ 情况 1:配置了 `curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1)`(你的代码写法 ✅ 开发首选)
✅ **返回响应内容**:执行成功 → 返回目标 URL 的**完整响应体字符串**(HTML 源码、JSON 数据、纯文本、XML 等);
✅ **返回错误标识**:执行失败 → 返回布尔值 `false`(如网络中断、域名解析失败、URL 无效)。
> ✅ 你的代码正是用这种配置,所以`output = curl_exec(ch)`能直接接收响应内容,这是开发中 99% 的使用方式!
✔️ 情况 2:未配置 / 配置了 `curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0)`(默认值 ❌ 不推荐)
✅ **直接输出内容**:执行成功 → **不会返回响应内容**,而是将响应体**直接打印到页面 / 控制台**;
✅ **仅返回状态标识**:执行成功返回`true`,执行失败返回`false`,**无法获取响应内容本身**。
> ❌ 弊端:内容被强制输出,无法赋值给变量做解析、存储等后续操作,开发中几乎不用。
✅ 你的代码中返回值对应关系
```
// 你的代码核心行
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 配置返回模式为「赋值」
output = curl_exec(ch); // ✅ 执行后,响应内容直接存入$output变量
```
curl_getinfo()
PHP-CURL 扩展的 **请求信息获取函数**,是 CURL 请求链路中**专属的「数据统计 / 信息采集」工具**,也是你代码中实现「404 状态码判断」的核心函数。
✅ 核心作用
✅ 仅能在 `curl_exec()` 执行后调用,**提取已完成的 CURL 会话句柄`$ch`中存储的「请求 + 响应全量信息」**;
✅ 可获取「HTTP 状态码、请求 URL、响应耗时、传输字节数」等几十种数据,满足**请求状态判断、接口性能分析、错误排查**等需求;
✅ 你的`get()`函数能精准捕获 404,完全依赖该函数提取的 HTTP 响应状态码,是业务容错的核心。
> ✅ 通俗理解:`curl_exec()` = 按下回车访问网页、`curl_getinfo()` = **查看本次访问的「详情数据」**(比如是否 404、加载耗时多久、访问的真实地址)。
写法1:不传$opt → 获取【全部】请求信息,返回关联数组
```
array curl_getinfo ( resource $ch )
```
写法2:传入$opt → 获取【指定】的某一项信息,返回对应值(你的代码写法 ✅ 开发首选)
```
mixed curl_getinfo ( resource ch , int opt = 0 )
```
✅ 参数 1:`$ch`(必传,核心)
-
类型:`resource`(CURL 资源句柄)
-
要求:必须是 `curl_init()` 创建、且已执行 `curl_exec()` 的**有效句柄**;
-
你的代码对应:直接传入初始化好的`$ch`,完全符合要求。
✅ 参数 2:`$opt`(可选,核心筛选)
-
类型:`int`(PHP 内置的`CURLINFO_*`系列常量)
-
作用:指定「要提取哪一项具体信息」,不传则返回**所有信息的关联数组**;
-
你的代码对应:传入`CURLINFO_HTTP_CODE`,专门提取「HTTP 响应状态码」。
写法 1(不传`$opt`)→ 返回「全量信息数组」
执行成功返回**关联数组**,数组的`key`是`CURLINFO_*`常量名,`value`是对应信息,示例:
```
allInfo = curl_getinfo(ch);
print_r($allInfo);
```
输出示例(核心片段):
```
Array
(
url\] =\> https://www.baidu.com \[http_code\] =\> 200 // HTTP状态码 \[total_time\] =\> 0.02 // 整个请求耗时(秒) \[size_download\] =\> 12345 // 下载的字节数 \[ssl_verify_result\] =\> 0 // SSL验证结果 ) \`\`\` #### 写法 2(传入\`$opt\`)→ 返回「指定单项值」(你的代码用法) 执行成功返回\*\*单一值\*\*,值的类型由\`$opt\`决定;执行失败返回\`false\`。 你的代码中:\`curl_getinfo($ch, CURLINFO_HTTP_CODE)\` → 直接返回\*\*整型的 HTTP 状态码\*\*(如 200、404、500),极简高效! \`\`\` // 你的代码原句 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if($httpCode == 404) { return 404; } \`\`\` ### ✅ 1. 核心常量:\`CURLINFO_HTTP_CODE\` 详解 这是开发中\*\*最常用、最核心\*\*的\`CURLINFO_\*\`常量,没有之一: - ✅ 含义:提取本次 CURL 请求的 \*\*HTTP 响应状态码\*\*; - ✅ 返回值类型:\`整型\`(如 200、404、302、500); - ✅ 状态码意义(高频): ✔️ 200 → 请求成功,服务器正常返回内容; ✔️ 404 → 资源未找到; ✔️ 301/302 → 页面重定向; ✔️ 500 → 目标服务器内部错误; ✔️ 403 → 目标服务器拒绝访问。 - \`curl_getinfo()\` \*\*强依赖\`curl_exec()\`\*\*:没有执行请求,就没有可提取的信息; - \`curl_getinfo()\` \*\*必须早于\`curl_close()\`\*\*:句柄关闭后,所有信息被销毁,无法提取; - 提取的信息\*\*仅对当前\`$ch\`有效\*\*:不同 CURL 句柄的信息相互独立,互不干扰。 ## curl_close() PHP-CURL 扩展的 \*\*收尾 / 销毁函数\*\*,是 CURL 请求链路中 \*\*最后一步、必执行步骤\*\*,与 \`curl_init()\` 形成\*\*严格的成对关系\*\*,也是保障服务器资源安全的核心函数。 ### ✅ 核心作用 ✅ 关闭一个\*\*已初始化、已执行\*\*的 CURL 会话句柄 \`$ch\`,\*\*强制释放该句柄占用的所有系统资源\*\*; ✅ 销毁 CURL 句柄中存储的「请求配置、响应数据、状态信息」等所有内容,让 \`$ch\` 变为无效句柄; ✅ 你的\`get()\`函数中,它是请求完成后的\*\*规范收尾操作\*\*,能彻底避免服务器内存泄漏、资源耗尽的风险。 \> ✅ 通俗理解(延续之前的浏览器类比): \> \> \`curl_init()\` = 打开浏览器窗口、\`curl_close()\` = \*\*关闭浏览器窗口\*\*; \> \> 用完浏览器不关闭,会占用电脑内存;用完 CURL 句柄不关闭,会占用服务器资源。 \`\`\` void curl_close ( resource $ch ) \`\`\` \| 参数 \| 类型 \| 是否必填 \| 核心说明 \| 代码对应 \| \| --- \| -------- \| ---- \| ------------------------------------------------ \| ------------ \| \| $ch \| resource \| 是 \| 由\`curl_init()\`创建的\*\*有效 CURL 资源句柄\*\*,可是已执行 / 未执行的句柄 \| 代码中直接传入\`$ch\` \| 函数返回值为 \`void\`(无返回值),调用后\*\*不会返回任何数据\*\*,也无需接收返回值,执行即完成资源释放操作。