实际上我们让大模型生成一段代码不是不行,以下代码实际也是大模型生成的,然后我再修改的。记下来主要是方便自己使用的时候好找,也是为了积累经验。
function _curl_get($url) {
$ch = curl_init();
// 设置自定义请求头
$headers = [
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", // 自定义 User-Agent ,还有另一种做法就是设置 CURLOPT_USERAGENT
"X-Requested-With: XMLHttpRequest", // 标识是来自 XHR 请求
"Accept: application/json", // 根据需要配置
];
// 设置 URL
curl_setopt($ch, CURLOPT_URL, $url);
// 返回结果而不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 跟随重定向
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// 设置连接超时时间(秒)
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 连接超时,10秒,具体来说,这个超时指的是以下过程的时间限制:DNS 解析和TCP 三次握手的TCP连接建立超时。
// 设置请求超时时间(秒)
curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 请求超时,30秒,具体来说,这个超时控制整个HTTP请求的时间,包括连接时间、数据传输时间。
// 启用连接复用
curl_setopt($ch, CURLOPT_FORBID_REUSE, false);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, false);
// 启用压缩
curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate');
// 启用 HTTP/2
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
// SSL/TLS 安全设置
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 不验证证书合法性
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 不验证主机名
// 设置自定义请求头
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// 数据传输优化
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128000);// 设置缓冲区大小为 128KB
$response = curl_exec($ch);
if ($error = curl_error($ch)) {
curl_close($ch);
throw new Exception("cURL error: " . $error);
}
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200) {
throw new Exception("HTTP request failed with status code $httpCode");
}
return $response;
}
为什么要封装这个CURL呢,实际上是因为PHP提供的这一模块实在难以记忆,看上去很灵活,实则不然,你不每次查词典完全不会使用。我们通常会忽略ssl认证,并且需要设置超时,需要修改user-agent。以上函数的用法:
try {
$url = "https://example.com";
$response = _curl_get($url);
echo "Response:\n$response\n";
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}