0

0

PHP 中使用 curl_exec() 执行 HTTP 请求的正确方式

聖光之護

聖光之護

发布时间:2026-01-19 11:48:12

|

692人浏览过

|

来源于php中文网

原创

PHP 中使用 curl_exec() 执行 HTTP 请求的正确方式

本文详解如何在 php 中正确使用 curl 扩展发起带代理的 https 请求,纠正将 shell 命令字符串误传给 curl_exec() 的常见错误,并提供可直接运行的完整示例代码。

在 PHP 中调用系统 curl 命令(如通过 shell_exec() 或拼接字符串后误传给 curl_exec())不仅存在严重安全隐患,更会导致逻辑错误——正如问题中所示:curl_exec() 接收的必须是一个由 curl_init() 创建的有效 cURL 资源句柄,而非字符串命令。你遇到的错误 'curl_exec() expects parameter 1 to be resource, string given' 正是这一根本性误用的直接体现。

正确的做法是完全使用 PHP 的原生 cURL 扩展函数,而非依赖外部 shell 命令。这不仅能确保类型安全、提升执行效率,还能精细控制请求头、代理认证、SSL 验证、重定向、超时等关键行为,为后续反爬策略(如 User-Agent 轮换、请求间隔、Cookie 管理)打下坚实基础。

以下是一个结构清晰、生产可用的示例代码:

动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版
动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版

动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包

下载
<?php
// 目标搜索 URL(请替换为实际 SKU)
$focusSKU = '145131';
$searchURL = "https://www.bestbuy.com/site/searchpage.jsp?st=" . urlencode($focusSKU);

// 代理配置(请替换为真实凭证)
$proxyHost = 'us.proxymesh.com'; // 注意:不包含 http://
$proxyPort = 31280;
$proxyUser = 'your_proxy_username';
$proxyPass = 'your_proxy_password';

// 初始化 cURL 句柄
$ch = curl_init();

// 必需配置项
curl_setopt($ch, CURLOPT_URL, $searchURL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);     // 关键:使 curl_exec() 返回字符串而非直接输出
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);      // 自动跟随 301/302 重定向
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);     // 开发调试时可禁用证书验证(生产环境建议保持 true)
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);              // 设置最大执行时间(秒)

// 代理相关设置
curl_setopt($ch, CURLOPT_PROXY, "$proxyHost:$proxyPort");
curl_setopt($ch, CURLOPT_PROXYUSERPWD, "$proxyUser:$proxyPass");
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); // 明确指定 HTTP 代理类型

// 可选但推荐:模拟真实浏览器请求头,降低被拦截概率
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');

// 执行请求
$response = curl_exec($ch);

// 检查错误
if ($response === false) {
    $error = curl_error($ch);
    $errno = curl_errno($ch);
    error_log("cURL Error [{$errno}]: {$error}");
    echo "请求失败:{$error}";
} else {
    echo "响应状态码:" . curl_getinfo($ch, CURLINFO_HTTP_CODE) . "\n";
    echo "响应长度:" . strlen($response) . " 字节\n";
    // 可选:打印前 500 字符预览(避免大响应阻塞)
    echo "响应片段:" . substr($response, 0, 500) . "...\n";
}

// 释放资源
curl_close($ch);
?>

⚠️ 重要注意事项

立即学习PHP免费学习笔记(深入)”;

  • 切勿拼接字符串后传给 curl_exec():curl_exec() 的参数必须是 curl_init() 返回的 resource 类型,否则必然报错。
  • 代理 URL 格式差异:PHP cURL 的 CURLOPT_PROXY 仅接受 host:port 形式(如 us.proxymesh.com:31280),不能写成 http://user:pass@host:port;认证信息需单独通过 CURLOPT_PROXYUSERPWD 设置。
  • 协议与安全性:对 HTTPS 目标站点,确保 PHP 编译时启用了 OpenSSL 支持;生产环境应启用 CURLOPT_SSL_VERIFYPEER => true 并配置 CA 证书路径(如 CURLOPT_CAINFO)。
  • 访问被拒(403)的常见原因:BestBuy 等电商站通常严格校验 User-Agent、Accept、Referer 等请求头,甚至检测 TLS 指纹和 JS 行为。若返回 “Access Denied”,优先检查并完善请求头,而非怀疑代理本身。

掌握原生 PHP cURL 的标准用法,是构建健壮网络采集脚本的第一步。从这个简洁可靠的起点出发,你可逐步增强功能——例如封装为可复用的 CurlClient 类、集成 CookieJar、添加重试机制或对接分布式代理池。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

404

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

249

2023.10.07

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

950

2023.08.02

resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

176

2023.12.20

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6496

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

366

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

441

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

97

2025.08.19

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

19

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号