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 相关文章推荐
一个简单的MySQL数据浏览器
Oct 09 PHP
Windows2003 下 MySQL 数据库每天自动备份
Dec 21 PHP
php 中文和编码判断代码
May 16 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
Apr 08 PHP
修改destoon会员公司的伪静态中的com目录的方法
Aug 21 PHP
php中json_encode UTF-8中文乱码的更好解决方法
Sep 28 PHP
PHP5.2下preg_replace函数的问题
May 08 PHP
PHP实现留言板功能的详细代码
Mar 25 PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 PHP
PHP使用Redis实现Session共享的实现示例
May 12 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 PHP
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
Apr 16 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与C#的值类型指向区别的详解
2013/05/21 PHP
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
Vue-cli中为单独页面设置背景色的实现方法
2018/02/11 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
Vue-Cli项目优化操作的实现
2019/10/27 Javascript
[02:20]DOTA2亚洲邀请赛 EHOME战队出场宣传片
2015/02/07 DOTA
python fabric实现远程操作和部署示例
2014/03/25 Python
编程语言Python的发展史
2014/09/26 Python
Python中模拟enum枚举类型的5种方法分享
2014/11/22 Python
python实现用于测试网站访问速率的方法
2015/05/26 Python
Golang与python线程详解及简单实例
2017/04/27 Python
Python实现登录接口的示例代码
2017/07/21 Python
Python中装饰器学习总结
2018/02/10 Python
TensorFlow Session会话控制&amp;Variable变量详解
2018/07/30 Python
Python 函数返回值的示例代码
2019/03/11 Python
python 实现提取log文件中的关键句子,并进行统计分析
2019/12/24 Python
Pytorch maxpool的ceil_mode用法
2020/02/18 Python
Python selenium文件上传下载功能代码实例
2020/04/13 Python
俄罗斯电子产品在线商店:UltraTrade
2020/01/30 全球购物
编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串
2014/01/07 面试题
测试驱动开发的主要步骤是什么
2014/12/10 面试题
建筑个人求职信范文
2014/01/25 职场文书
大学生先进事迹材料
2014/02/16 职场文书
《雷雨》教学反思
2014/02/20 职场文书
保洁公司服务承诺书
2014/05/28 职场文书
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
三严三实对照检查材料思想汇报
2014/09/28 职场文书
会议通知格式范文
2015/04/15 职场文书
鸦片战争观后感
2015/06/09 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
goland 清除所有的默认设置操作
2021/04/28 Golang
MySQL 自定义变量的概念及特点
2021/05/13 MySQL
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS