PHP中CURL的CURLOPT_POSTFIELDS参数使用细节


Posted in PHP onMarch 17, 2014

在通常情况下,我们使用 CURL 来提交 POST 数据的时候,我们已经习惯了这样的写法:

curl_setopt( $ch, CURLOPT_POSTFIELDS,$post_data);

但是这样的写法在有时候并不会很好用,可能会得到服务器返回的 500 错误。但是我们尝试在使用 Socket 方式向服务器提交数据的时候,我们会得到非常正确的结果。
例如我们在服务器上面存在一个如下的 PHP 文件:
<?php print_r($_SERVER);?>

当我们采用 CURL 在不注意细节的前提下向服务器发送一些数据,我们可能得到下面这样的结果,这不是我们理想中的结果:
[CONTENT_TYPE] => multipart/form-data; boundary=—————————-f924413ea122

但是如果我们在采用 http_build_query($post_data) 来替代 $post_data 再向这个 PHP 脚本提交数据的时候,我们就会得到和上面不同的结果,这才是我们理想中的结果:
[CONTENT_TYPE] => application/x-www-form-urlencoded

从上面这个例子中不难看出,使用 CURL 并且参数为数据时,向服务器提交数据的时候,HTTP头会发送Content_type: application/x-www-form-urlencoded。这个是正常的网页<form>提交表单时,浏览器发送的头部。而 multipart/form-data 我们知道这是用于上传文件的表单。包括了 boundary 分界符,会多出很多字节。
官方的手册上是这样说的:
The full data to post in a HTTP “POST” operation. To post a file, prepend a filename with @ and use the full path. This can either be passed as a urlencoded string like ‘para1=val1¶2=val2&…' or as an array with the field name as key and field data as value. If value is an array, the Content-Type header will be set to multipart/form-data.

使用数组提供 post 数据时,CURL 组件大概是为了兼容 @filename 这种上传文件的写法,默认把 content_type 设为了 multipart/form-data。虽然对于大多数服务器并没有影响,但是还是有少部分服务器不兼容。
经过一番总结最终得出结论:在没有需要上传文件的情况下,尽量对 post 提交的数据进行 http_build_query 处理,然后再发送出去,能实现更好的兼容性,更小的请求数据包。
PHP 相关文章推荐
一个查看session内容的函数
Oct 09 PHP
PHP使用递归生成文章树
Apr 21 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
Mar 19 PHP
PHP面试常用算法(推荐)
Jul 22 PHP
PHP对称加密函数实现数据的加密解密
Oct 27 PHP
php使用curl代理实现抓取数据的方法
Feb 03 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
Oct 12 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
May 28 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
Dec 02 PHP
php操作redis常见方法示例【key与value操作】
Apr 14 PHP
PHP7 字符串处理机制修改
Mar 09 PHP
PHP同时连接多个mysql数据库示例代码
Mar 17 #PHP
PHP的password_hash()使用实例
Mar 17 #PHP
PHP5各个版本的新功能和新特性总结
Mar 16 #PHP
使用PHP生成二维码的两种方法(带logo图像)
Mar 14 #PHP
19个超实用的PHP代码片段
Mar 14 #PHP
php的zip解压缩类pclzip使用示例
Mar 14 #PHP
php多功能图片处理类分享(php图片缩放类)
Mar 14 #PHP
You might like
77A一级收信机修理记
2021/03/02 无线电
一个比较简单的PHP 分页分组类
2009/12/10 PHP
PHP URL参数获取方式的四种例子
2014/02/28 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
php判断邮箱地址是否存在的方法
2016/02/13 PHP
php通过执行CutyCapt命令实现网页截图的方法
2016/09/30 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
jQuery 下拉列表 二级联动插件分享
2012/03/29 Javascript
JS解决url传值出现中文乱码的另类办法
2013/04/08 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
浅析javascript中的事件代理
2015/11/06 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
react开发教程之React 组件之间的通信方式
2017/08/12 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
2018/08/10 Javascript
使用 UniApp 实现小程序的微信登录功能
2020/06/09 Javascript
Python中的自定义函数学习笔记
2014/09/23 Python
Python中使用PyQt把网页转换成PDF操作代码实例
2015/04/23 Python
Python的面向对象编程方式学习笔记
2016/07/12 Python
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
Python学习之Anaconda的使用与配置方法
2018/01/04 Python
Python代码打开本地.mp4格式文件的方法
2019/01/03 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
python字典一键多值实例代码分享
2019/06/14 Python
Pandas的read_csv函数参数分析详解
2019/07/02 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
Python 实现自动完成A4标签排版打印功能
2020/04/09 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
机械制造专业毕业生求职信
2014/03/02 职场文书
家长会演讲稿
2014/04/26 职场文书
大学生村官座谈会发言材料
2014/05/25 职场文书
群众路线查摆问题整改措施
2014/10/10 职场文书
外科护士长工作总结
2015/08/12 职场文书
FP-growth算法发现频繁项集——发现频繁项集
2021/06/24 Python
Vue实现跑马灯样式文字横向滚动
2021/11/23 Vue.js