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 相关文章推荐
解决GD中文乱码问题
Feb 14 PHP
php合并js请求的例子
Nov 01 PHP
PHPMailer的主要功能特点和简单使用说明
Feb 17 PHP
php设计模式之命令模式使用示例
Mar 02 PHP
php实现window平台的checkdnsrr函数
May 27 PHP
学习php设计模式 php实现命令模式(command)
Dec 08 PHP
PHP魔术方法之__call与__callStatic使用方法
Jul 23 PHP
php基于自定义函数记录log日志方法
Jul 21 PHP
PHP文字转图片功能原理与实现方法分析
Aug 31 PHP
php和vue配合使用技巧和方法
May 09 PHP
在 Laravel 项目中使用 webpack-encore的方法
Jul 21 PHP
php实现简单的守护进程创建、开启与关闭操作
Aug 13 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
PHP mcrypt可逆加密算法分析
2011/07/19 PHP
php数组函数序列之array_intersect() 返回两个或多个数组的交集数组
2011/11/10 PHP
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
2013/07/03 PHP
MongoDB在PHP中的常用操作小结
2014/02/20 PHP
PHP获取Exif缩略图的方法
2015/07/13 PHP
jquery 查找iframe父级页面元素的实现代码
2011/08/28 Javascript
DOM和XMLHttpRequest对象的属性和方法整理
2012/01/04 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
jquery实现excel导出的方法
2013/04/04 Javascript
浅谈页面装载js及性能分析方法
2014/12/09 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
2015/09/12 Javascript
不依赖Flash和任何JS库实现文本复制与剪切附源码下载
2015/10/09 Javascript
jQuery移动端图片上传组件
2016/06/12 Javascript
jQuery插件扩展操作入门示例
2017/01/16 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
jQuery自动或手动图片切换效果
2017/10/11 jQuery
微信小程序实现登录注册tab切换效果
2020/12/29 Javascript
深入学习JavaScript中的bom
2019/05/27 Javascript
JS中的一些常用的函数式编程术语
2019/06/15 Javascript
[01:02:17]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG
2014/05/26 DOTA
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
老生常谈Python基础之字符编码
2017/06/14 Python
解决Python3中的中文字符编码的问题
2018/07/18 Python
django query模块
2019/04/20 Python
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
python 使用cx-freeze打包程序的实现
2020/03/14 Python
python zip()函数的使用示例
2020/09/23 Python
纯css3制作煽动翅膀的蝴蝶的示例
2018/04/23 HTML / CSS
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
2016/03/14 HTML / CSS
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
户籍证明的格式
2014/01/13 职场文书
乡镇干部先进事迹材料
2014/02/03 职场文书
2014年企业团支部工作总结
2014/12/10 职场文书
2019辞职报告范本3篇!
2019/07/23 职场文书
Java spring定时任务详解
2021/10/05 Java/Android