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简单开启gzip压缩方法(zlib.output_compression)
Apr 13 PHP
php实现的发送带附件邮件类实例
Sep 22 PHP
smarty模板引擎从配置文件中获取数据的方法
Jan 22 PHP
laravel容器延迟加载以及auth扩展详解
Mar 02 PHP
ThinkPHP 3.2 版本升级了哪些内容
Mar 05 PHP
php数组索引与键值操作技巧实例分析
Jun 24 PHP
基于PHP给大家讲解防刷票的一些技巧
Nov 18 PHP
php实现图片上传并利用ImageMagick生成缩略图
Mar 14 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
Sep 23 PHP
PHP实现统计在线人数功能示例
Oct 15 PHP
php基于单例模式封装mysql类完整实例
Oct 18 PHP
php mysql操作mysql_connect连接数据库实例详解
Dec 26 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文件
2007/01/04 PHP
php生成过去100年下拉列表的方法
2015/07/20 PHP
PHP7变量处理机制修改
2021/03/09 PHP
表单提交验证类
2006/07/14 Javascript
关于Javascript 的 prototype问题。
2007/01/03 Javascript
Jquery AJAX 框架的使用方法
2009/11/03 Javascript
jQuery UI的Dialog无法提交问题的解决方法
2011/01/11 Javascript
运用jQuery定时器的原理实现banner图片切换
2014/10/22 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
禁止按回车键提交表单的方法
2015/06/11 Javascript
jQuery进行组件开发完整实例
2015/12/15 Javascript
url中的特殊符号有什么含义(推荐)
2016/06/17 Javascript
jQuery 判断是否包含在数组中Array[]的方法
2016/08/03 Javascript
JS+canvas绘制的动态机械表动画效果
2017/09/12 Javascript
jquery.picsign图片标注组件实例详解
2018/02/02 jQuery
快速了解vue-cli 3.0 新特性
2018/02/28 Javascript
浅谈Vue Element中Select下拉框选取值的问题
2018/03/01 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
前后端常见的几种鉴权方式(小结)
2019/08/04 Javascript
解决ant design vue 表格a-table二次封装,slots渲染的问题
2020/10/28 Javascript
CentOS 8.2服务器上安装最新版Node.js的方法
2020/12/16 Javascript
Python加密方法小结【md5,base64,sha1】
2017/07/13 Python
Python3学习笔记之列表方法示例详解
2017/10/06 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
python消费kafka数据批量插入到es的方法
2018/12/27 Python
python list的index()和find()的实现
2020/11/16 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
SKECHERS斯凯奇中国官网:来自美国的运动休闲品牌
2018/11/14 全球购物
美体小铺奥地利官方网站:The Body Shop奥地利
2019/04/11 全球购物
大学军训感言800字
2014/02/27 职场文书
综合内勤岗位职责
2014/04/14 职场文书
青春奉献演讲稿
2014/05/08 职场文书
golang 实现两个结构体复制字段
2021/04/28 Golang
Vue的过滤器你真了解吗
2022/02/24 Vue.js