PHP中的cURL请求及示例学习笔记
备注:使用curl_init函数,必须要打开这个php扩展。
1.打开php.ini,开启extension=php_curl.dll
2.检查php.ini的extension_dir值是哪个目录,检查有无php_curl.dll,没有的请下载php_curl.dll,再把php目录中的libeay32.dll,ssleay32.dll拷到c:/windows/system32里面。
最近在学习腾讯开放平台API接口的过程中,看到了一个很强大的PHP库——cURL。它是利用URL语法在命令行方式下工作的文件传输工具。这篇文章是博主直接从国外一个博客翻译过来的,原文地址是:http://codular.com/curl-with-php。这篇文章讲的很基础,但条理很清晰,知识比较系统和全面,所以转过来收藏了!(下面的有些标题是博主画蛇添足的,大家近乎可以忽略。)
1 定义:什么是cURL
cURL允许数据传输跨广泛的协议,是一个非常强大的系统。它广泛用于跨网站发送数据,包括诸如API交互和oAuth。cURL是在它的应用范围内几乎是无所不能的,从基本的HTTP请求,到更为复杂的FTP上传或封闭式HTTPS网站的交互验证。让我们一起来看看发送一个GET和POST请求和处理返回的响应的简单区别,以及一些重要的参数说明。
在我们通过一个cURL请求做任何事之前,我们首先需要初始化一个cURL的实例。我们可以通过调用函数curl_init()函数实现,它会返回一个cURL资源。该函数接收你想要发送的请求URL作为它的一个参数。在本文中,我们先不做这一步,可以在接下来的过程中用另一种方式来实现它。
2 须知:一些核心设置
一旦我们得到了一个cURL资源,我们可以开始进行一些配置,下面列出我总结的一些核心设置。
CURLOPT_RETURNTRANSFER - 返回响应作为一个字符串,而不是输出到屏幕
CURLOPT_CONNECTTIMEOUT - 连接超时的时间
CURLOPT_TIMEOUT - cURL执行的超时时间
CURLOPT_USERAGENT - 用于请求的Useragent字符串
CURLOPT_URL - 发送请求的URL对象
CURLOPT_POST - 以POST方式发送一个请求
CURLOPT_POSTFIELDS - 在POST提交的请求中的数组数据
3 创建一个配置
我们可以通过使用curl_setopt()方式创建一个配置,这个方式接受3个参数:cURL资源、设置以及设置对应的值。因此,我们可以如下所示设置我们正在发送的请求URL。
代码如下 | 复制代码 |
$curl = curl_init(); |
如上所示,当获取cURL资源时,我们可以通过传送一个参数来设置URL。
代码如下 | 复制代码 |
$curl = curl_init('http://www.111cn.net'); |
当然我们也可以通过给curl_setopt_array()函数传递一个包含变量名和变量值的数组一次性地创建多重配置。
代码如下 | 复制代码 |
$curl = curl_init(); |
4 执行请求:curl_exec()
当所有选项都配置好后,准备发送请求时,我们可以通过调用curl_exec()方式来执行这个cURL请求。这个函数将会返回三种不同的情形:
代码如下 | 复制代码 |
$result = curl_exec($curl); |
此时,$result已经包含了页面的响应——它可能是JSON,一个字符串或者一个完整的网站的HTML。
5 关闭请求:curl_close()
当你发送完一个请求并且获取到了相应的返回结果,你就需要关闭这个cURL请求以便释放一些系统资源。通过调用curl_close()方法,我们可以像其它所有需要将资源作为参数的函数一样简单实现资源的释放。
6 GET请求
GET请求是默认的请求方法,并且我们可以很直截了当的使用它。事实上所有的例子到目前为止一直都是GET请求。如果你想在请求中加入传入一些参数,那么你可以像http://testcURL.com/?item1=value&item2=value2一样把这些参数作为一个查询字符串附加在URL地址后面。
因此,我们可以通过如下示例发送一个GET请求到上面的URL中去,并且返回相应的结果。
代码如下 | 复制代码 |
// Get cURL resource |
7 POST请求
GET请求和POST请求两者之间语法的唯一区别就是:在你想要传送一些数据时,多了一个设置。我们将把CURLOPT_POST设置为true,并且通过设置CURLOPT_POSTFIELDS来传送包含一个数组的数据。
因此,如果把上面的GET请求转换为POST请求,我们可以使用下面的代码:
代码如下 | 复制代码 |
// Get cURL resource |
到这里,你就拥有了这样的一个POST请求:它将产生和上面GET请求一样的效果,并且把返回数据到脚本中,这样你就可以随便使用它们了。
发起https请求示例
代码如下 | 复制代码 |
function _https_curl_post($url, $vars) |
8 错误
尽管我们讨厌错误,但是你还是得注意使用cURL时可能出现的情形。因为你最终无法控制你所发送请求的网站,也无法保证该站点的响应结果将会是你预想的那种方式以及这个站点一直都会是正常状态。
这里提供了两个可以用来处理错误的函数:
curl_error() - 返回一个字符串错误信息(当请求正常返回时,其值为空)
curl_errno() - 返回cURL的错误数目,然后你可以查看这个包含错误代码的页面。
例如,你可以如下示例使用:
代码如下 | 复制代码 |
if(!curl_exec($curl)){ |
如果你想要任何HTTP响应代码都大于400来产生一个错误,而不是返回整个HTML页面,那么你可以把CURLOPT_FAILONERROR设置为true。cURL是一个“庞然大物”,并且还有很多很多的可能。有些网站可能为一些用户代理提供服务页面,当使用API接口时,它们可能会要求你传送一个特别的用户代理,这些都是我们需要注意的。如果你还想了解一些cURL请求,为何不尝试去oAuth with Instagram看看呢?
phpmyadmin是一款WEB版的mysql数据库管理工具,他可以对mysql数据库进行各种操作,但是我必须在phpmyadmin中配置好用户名与登录密码才可以,如果mysql 密码修改了随之phpmyadmin中的密码也需要修改哦。xampp/phpMyAdmin/config.inc.php设置的密码(为空)冲突,从而使得用户无法登陆(在电脑为重新启动前能登录phpmyadmin,但是一旦机器重启后就无法登录了)。
解决办法也很简单:
1 修改xampp中关于phpmyadmin的配置文件
进入xampp的安装目录,修改xampp/phpMyAdmin/config.inc.php文件,找到并设置开始修改的密码,
例如$cfg['Servers'][$i]['password'] = '8888';
2 清除浏览器缓存,重新登录http://127.0.0.1/phpmyadmin/即可
另外,我们点击“权限”后可以看到整个数据库的用户如下,可以点击“操作”再次修改用户密码,相应地修改config.inc.php。
小结
w
其实这个就是对xampp/phpMyAdmin/config.inc.php的$cfg['Servers'][$i]['password'] = '8888';进入修改了,如果改了用户名也可以利用$cfg['Servers'][$i]['user'] = '你的用户名';这样修改哦。
php中curl功能的强大我想大家可能还不知道吧,下面我再介绍一个工作中用到的利用curl获取验证码的实例并且可以为造cookie.代码如下 | 复制代码 |
<?php $CookieFile=tempnam("./tmep","beast"); if(isset($_GET["img"])){ $url = 'http://www.111cn.net/phper/php.htm';//验证码code $ch = curl_init($url); curl_setopt($ch,CURLOPT_COOKIEJAR, $CookieFile);//把返回来的cookie信息保存在文件中 curl_exec($ch); curl_close($ch); exit(); } if(isset($_POST['d'])){ $b=$_POST[d];//验证码 $p="waybillNo=1721269381&inputcode=".$b; $ch = curl_init(); // 2. 设置选项,包括URL curl_setopt($ch,CURLOPT_URL, "http://www.111cn.net"); curl_setopt($ch,CURLOPT_COOKIEJAR, $CookieFile); curl_setopt($ch,CURLOPT_COOKIEFILE, $CookieFile);//同时发送Cookie curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch,CURLOPT_POST, 1); curl_setopt($ch,CURLOPT_POSTFIELDS, $p);//提交查询信息 $s = curl_exec($ch); curl_close($ch); $ch = curl_init(); curl_setopt($ch,CURLOPT_URL, http://www.111cn.net); curl_setopt($ch,CURLOPT_COOKIEFILE, $CookieFile);//同时发送Cookie curl_setopt($ch,CURLOPT_COOKIEJAR, $CookieFile); curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch,CURLOPT_POST, 1); curl_setopt($ch,CURLOPT_POSTFIELDS, $p);//提交查询信息 $bs = curl_exec($ch); echo $bs;//输出结果 curl_close($ch); }else{ ?> <form id="form1" name="form1" method="post" action=""> <img src="?img=true" /><!--由服务器端取图片内容并输出--> <input type="text" name="d" /> <input type="submit" name="button" id="button" value="提交" /> </form> <?php } ?> |
今天终于算是可以来更新一下paperen的网站,嗯……因为写毕设论文写累了所以就发表一篇关于上传文件类的东东吧,这个类也是自己写的,不知道对大家有没有用,如果觉得可以就拿去用吧。不过在编码上面还是没做好,自己是在utf8的页面将数据进行提交的,所以生成的文件如果保持原来的中文名字的话在文件夹中看到就是乱码的名字,如果不想出现乱码的话需要进行一下编码的转换。?
代码如下 | 复制代码 |
<?php define('NO_FILE', '不存在上传文件'); class file_uploader var $_file; /***使用方法与参数说明***/ //require("类文件"); ?> |
随便说下这个类怎样调用吧,方法很简单?
代码如下 | 复制代码 |
$dir = 'upload/'; |
就像N年前那个染头发的广告说的那句,“得左!染黑头发就是这么简单!”一样,这里上传文件的操作也是“上传文件就这么简单!”。当然那个$_FILES['upload_file']是对应表单中的file类型的控件的名字。而需不需要在上传后输出提示就看你自己啦,关于参数在代码那里面有详细说明,不过这里也是放出来吧。?
ready方法的参数说明:
第一个参数$dir 为上传文件存放的路径
第二个参数为$_FILES 为你那个上传文件变量
第三个参数允许文件大小 单位为MB
第四个参数允许的文件类型 格式为jpg|png|gif
第五个参数是否需要生成新的文件名
第六个参数为返回的提示格式 0为直接提示上传正确 1则返回一个数组array('filename' => 上传的文件名字, 'filesize' => 文件大小, 'tip' => 成功上传);?
很好!这样就完成了一篇文章,不过也花了不少时间呢……?
在php中设置cookie与删除cookie都可以使用php setcookie来实现,如果设置就设置有值,如果删除就设置 cookie value为空或null或时间过期都可以删除,下面我们来看一些实例。长久以来,在php中删除cookie的时候,都是使用
bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string
$domain [, bool $secure = false [, bool $httponly = false ]]]]]] )
$value 随便写, $expire设置为一个已经过去的时间即可。
官方文档中也是这样写的:
http://www.php.net/manual/en/function.setcookie.php
Example #2 setcookie() delete example
When deleting a cookie you should assure that the expiration date is in the past, to trigger
the removal mechanism in your browser. Examples follow how to delete cookies sent in previous
example:
代码如下 | 复制代码 |
<?php // set the expiration date to one hour ago setcookie ("TestCookie", "", time() - 3600); setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", "example.com", 1); ?> |
今天遇到一件奇怪的事, 在setcookie的时候,传了一个空字符串给$value,结果竟然是此cookie被删除了
…
代码如下 | 复制代码 |
$name = "post_url"; delete_cookie |
相当不解。
去翻php 5.4.13 的源码:
ext/standard/head.c
代码如下 | 复制代码 |
173 PHP_FUNCTION(setcookie) FAILURE) { domain_len, secure, 1, httponly TSRMLS_CC) == SUCCESS) { expires, char *path, int path_len, char *domain, int domain_len, int secure, int url_encode, int httponly TSRMLS_DC) and 14 */ \t\r\n\013\014'" ); isspace for 13 and 14 */ \t\r\n\013\014'" ); TSRMLS_CC); ""); expires, 0 TSRMLS_CC); |
参数中的value在C语言中的类型是char * , 还有一个 value_len标明了它的长度。
如果value_len为0的话,就写了下面的cookie:
值为”deleted”, 过期时间为 Thu, 01-Jan-1970 08:00:01 CST 或者说是 Thu, 01-Jan-1970 00:00:01
GMT
看来setcookie($name, “”) 确实可以删除这个cookie了…
同理,在php中,strval(NULL) === “” , 所以 setcookie($name, NULL) 也就相当于 setcookie($name,
“”),同样可以删除此cookie.
另外,比较好奇的是:
代码如下 | 复制代码 |
if (value && value_len == 0) { } else { } |
else 中包含了 value 为null 的情况, 这是一种什么样的情况呢?
看来setcookie($name, “”) 确实可以删除这个cookie了…
同理,在php中,strval(NULL) === “” , 所以 setcookie($name, NULL) 也就相当于 setcookie($name,
“”),同样可以删除此cookie.
另外,比较好奇的是:
代码如下 | 复制代码 |
if (value && value_len == 0) { } else { } |
else 中包含了 value 为null 的情况, 这是一种什么样的情况呢?
相关文章
- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
- 下面小编就为大家带来一篇C#模拟http 发送post或get请求的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25
- 1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
- 这篇文章主要介绍了spring cloud gateway中如何读取请求参数的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-15
- 当我们在星际中开地图和几家电脑作战的时候,电脑的几个玩家相当于结盟,一旦我们出兵进攻某一家电脑,其余的电脑会出兵救援。 那么如何让各家电脑知道自己的盟友被攻击了...2016-11-25
- 下面通过四步给大家介绍了c#处理和对接http接口请求的方法,分步骤介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看下吧...2020-06-25
- 这篇文章主要介绍了使用Feign消费服务时POST/GET请求方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-25
- 这篇文章主要介绍了SpringMvc自动装箱及GET请求参数原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-19
- 这篇文章主要介绍了SpringMvc获取请求头请求体消息过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-17
- 这篇文章主要介绍了PHP如何使用cURL实现Get和Post请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-11
- 举一个简单的date例子 我将使用echo命令把内容输出到我们的客户端(浏览器)。我将使用下面的代码做为基础代码。 代码如下 复制代码 <!DOCTY...2016-11-25
- 这篇文章主要介绍了C#网络请求与JSON解析的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要介绍了vue 接口请求地址前缀本地开发和线上开发设置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-13
RestTemplate实现发送带headers的GET请求
这篇文章主要介绍了RestTemplate实现发送带headers的GET请求,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-30- Spring MVC是Spring系列框架中使用频率最高的部分。不管是Spring Boot还是传统的Spring项目,只要是Web项目都会使用到Spring MVC部分。因此程序员一定要熟练掌握MVC部分。本篇博客简要分析Spring MVC处理一个请求的流程。...2021-02-06
详解AngularJS中$http缓存以及处理多个$http请求的方法
$http 是 AngularJS 中的一个核心服务,用于读取远程服务器的数据,通过本文给大家介绍AngularJS中$http缓存以及处理多个$http请求的方法,希望的朋友一起学习吧...2016-02-12- 一篇Android学习笔记之多界面切换实例,希望对各位朋友有所帮助。 用过VB 、 VC#的朋友都知道,在VB或VC#里要进行窗口(界面)切换很容易 例如在VB、C#里: 有 Fom1、...2016-09-20
- 引用:意思是将原始对象在内存中的地址传递给目标对象,就相当于原始对象和目标对象指向的是同一个内存地址。此时,如果对目标对象或者原始对象进行修改,内存中的数据也会改...2016-11-25