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 相关文章推荐
PHP 多维数组排序实现代码
Aug 05 PHP
PHPMYADMIN 简明安装教程 推荐
Mar 07 PHP
排序算法之PHP版快速排序、冒泡排序
Apr 09 PHP
php生成随机字符串可指定纯数字、纯字母或者混合的
Apr 18 PHP
php中smarty实现多模版网站的方法
Jun 11 PHP
PHP弹出对话框技巧详细解读
Sep 26 PHP
10款实用的PHP开源工具
Oct 23 PHP
PHP模板引擎Smarty自定义变量调解器用法
Apr 11 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
May 28 PHP
php 将json格式数据转换成数组的方法
Aug 21 PHP
Laravel框架实现超简单的分页效果示例
Feb 08 PHP
thinkphp5实现无限级分类
Feb 18 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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
PHP 第一节 php简介
2012/04/28 PHP
PHP 线程安全与非线程安全版本的区别深入解析
2013/08/06 PHP
PHP+jQuery+Ajax实现用户登录与退出
2015/04/27 PHP
PHP Header用于页面跳转时的几个注意事项
2016/10/21 PHP
爱恋千雪-US-AscII加密解密工具(网页加密)下载
2007/06/06 Javascript
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
关于jquery的多个选择器的使用示例
2013/10/18 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
2015/03/10 Javascript
JavaScript操作cookie类实例
2015/03/31 Javascript
JavaScript给按钮绑定点击事件(onclick)的方法
2015/04/07 Javascript
jQuery动态修改字体大小的方法【测试可用】
2016/09/09 Javascript
jQuery旋转插件jqueryrotate用法详解
2016/10/13 Javascript
JavaScript数组去重算法实例小结
2018/05/07 Javascript
如何提升vue.js中大型数据的性能
2019/06/21 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
2019/08/28 Javascript
[59:44]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 paiN vs iG
2018/03/31 DOTA
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
Python内建数据结构详解
2016/02/03 Python
Python 快速实现CLI 应用程序的脚手架
2017/12/05 Python
Python多继承顺序实例分析
2018/05/26 Python
Windows 下python3.8环境安装教程图文详解
2020/03/11 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
Python做图像处理及视频音频文件分离和合成功能
2020/11/24 Python
CSS3 二级导航菜单的制作的示例
2018/04/02 HTML / CSS
辅导员评语
2014/05/04 职场文书
化学专业毕业生求职信
2014/07/28 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
授权委托书范本(单位)
2014/09/28 职场文书
水电施工员岗位职责
2015/04/11 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
2016年少先队活动总结
2016/04/06 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书
Python实现8种常用抽样方法
2021/06/27 Python
mysql中关键词exists的用法实例详解
2022/06/10 MySQL