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初学入门
Nov 19 PHP
PHP 进程锁定问题分析研究
Nov 24 PHP
php强制下载类型的实现代码
Apr 21 PHP
深入分析PHP引用(&amp;)
Sep 04 PHP
php中http与https跨域共享session的解决方法
Dec 20 PHP
Laravel 5框架学习之路由、控制器和视图简介
Apr 07 PHP
php pthreads多线程的安装与使用
Jan 19 PHP
PHP生成制作验证码的简单实例
Jun 12 PHP
PHP实现页面静态化的超简单方法
Sep 06 PHP
php简单实现文件或图片强制下载的方法
Dec 06 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
Jan 26 PHP
swoole锁的机制代码实例讲解
Mar 04 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 文件缓存的性能测试
2010/04/25 PHP
php高级编程-函数-郑阿奇
2011/07/04 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
PHP处理JSON字符串key缺少双引号的解决方法
2014/09/16 PHP
PHP简单实现防止SQL注入的方法
2018/03/13 PHP
关于Yii中模型场景的一些简单介绍
2019/09/22 PHP
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
2015/10/23 Javascript
jQuery实现简单滚动动画效果
2016/04/07 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
Node.js使用Express创建Web项目详细教程
2017/03/31 Javascript
详解Vue中使用v-for语句抛出错误的解决方案
2017/05/04 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
jQuery实现的回车触发按钮事件功能示例
2018/03/25 jQuery
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
2018/06/10 Javascript
解决jQuery使用append添加的元素事件无效的问题
2018/08/30 jQuery
[01:00] DOTA2英雄背景故事第五期之重力引力法则谜团
2020/07/16 DOTA
python分割和拼接字符串
2013/11/01 Python
Python生成随机密码的方法
2017/06/16 Python
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
2018/07/11 Python
python实现经纬度采样的示例代码
2020/12/10 Python
html5 svg 中元素点击事件添加方法
2013/01/16 HTML / CSS
这段代码难道不该打印出56吗
2013/02/27 面试题
安全环保演讲稿
2014/08/28 职场文书
学校四风对照检查材料
2014/08/28 职场文书
无房证明范本
2014/09/17 职场文书
2014年小学生迎国庆65周年演讲稿
2014/09/27 职场文书
业务内勤岗位职责
2015/04/13 职场文书
开学第一周总结
2015/07/16 职场文书
小学大队长竞选稿
2015/11/20 职场文书
2016幼儿园毕业感言
2015/12/08 职场文书
《风筝》教学反思
2016/02/23 职场文书
微软Win11什么功能最惊艳? Windows11新功能特性汇总
2021/11/21 数码科技