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应用提速面面观
Oct 09 PHP
随时给自己贴的图片加文字的php代码
Mar 08 PHP
php后台程序与Javascript的两种交互方式
Oct 25 PHP
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
May 04 PHP
PHP中通过语义URL防止网站被攻击的方法分享
Sep 08 PHP
PHP新手NOTICE错误常见解决方法
Dec 07 PHP
PHP防止跨域提交表单
Nov 01 PHP
php上传文件并显示上传进度的方法
Mar 24 PHP
php遍历类中包含的所有元素的方法
May 12 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
May 20 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
Dec 28 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
Oct 11 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脚本代码
2011/02/19 PHP
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
2014/10/21 PHP
PHP5.2中PDO的简单使用方法
2016/03/25 PHP
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
Egret引擎开发指南之运行项目
2014/09/03 Javascript
让人蛋疼的JavaScript语法特性
2014/09/30 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
2016/06/08 Javascript
AngularJS中使用ngModal模态框实例
2017/05/27 Javascript
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
2017/08/23 jQuery
JavaScript模块详解
2017/12/18 Javascript
NodeJS实现自定义流的方法
2018/08/01 NodeJs
ES6小技巧之代替lodash
2019/06/07 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
Python脚本实现12306火车票查询系统
2016/09/30 Python
python正则分析nginx的访问日志
2017/01/17 Python
用Python+OpenCV对比图像质量的几种方法
2019/07/15 Python
Python 硬币兑换问题
2019/07/29 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
使用CSS3实现一个3D相册效果实例
2016/12/03 HTML / CSS
美国内衣品牌:Leonisa
2016/08/14 全球购物
英国经济型酒店品牌:Travelodge
2019/12/17 全球购物
几个Linux面试题笔试题
2016/08/01 面试题
土木工程个人自荐信范文
2013/11/30 职场文书
园林资料员岗位职责
2013/12/30 职场文书
建筑工程毕业生自我鉴定
2014/01/14 职场文书
说明书怎么写
2014/05/06 职场文书
任命书格式
2014/06/05 职场文书
大学生就业自荐书
2014/06/16 职场文书
刑事上诉状(量刑过重)
2015/05/23 职场文书
2015年党总支工作总结
2015/05/25 职场文书
小学总务工作总结
2015/08/13 职场文书
用Python进行栅格数据的分区统计和批量提取
2021/05/27 Python