您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > php

CURL功能原来这么强大,PHP大神都在用

时间:2019-08-20 10:30:12  来源:  作者:
什么是curl?

curl 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。php也支持 curl 库。本文将介绍 curl 的一些高级特性,本期文章会教大家如何使用它。

为什么要用 curl?

CURL功能原来这么强大,PHP大神都在用

 

是的,我们可以通过其他办法获取网页内容。大多数时候,我因为想偷懒,都直接用简单的PHP函数:

代码演示

$content = file_get_contents("http://www.xxx.com"); //直接获取网页上的内容

$lines = file("http://www.xxx.com");

readfile(http://www.xxx.com);

不过,这种做法缺乏灵活性和有效的错误处理。而且,你也不能用它完成一些高难度任务——比如处理coockies、验证、表单提交、文件上传等等,那么这个时候curl就派上用处。

因为curl本身是一种功能强大的库,支持很多不同的协议能提供 URL 请求相关的各种细节信息。

下面直接教大家如何使用curl

在学习更为复杂的功能之前,先来看一下请求的基本步骤:

// 1. 初始化

$ch = curl_init();

// 2. 设置选项,包括URL

curl_setopt($ch, CURLOPT_URL, "http://www.baidu.com");

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_HEADER, 0);

// 3. 执行并获取html文档内容

$output = curl_exec($ch);

// 4. 释放curl句柄

curl_close($ch);

CURL功能原来这么强大,PHP大神都在用

 

第二步(也就是 curl_setopt() 有一长串cURL参数可供设置,它们能指定URL请求的各个细节。要一次性全部介绍完比较难,今天我们只试一下那些更常用也更有用的选项。

$output = curl_exec($ch);

if ($output === FALSE) {//检测是否错误

echo "curl Error: " . curl_error($ch);

}

curl_exec($ch);

$info = curl_getinfo($ch);//直接返回结果给info

返回的数组中包括了以下信息:

curl_setopt设置的参数

"URL" //资源网络地址

"CONTENT_TYPE" //内容编码

"HTTP_CODE" //HTTP状态码

"HEADER_SIZE" //header的大小

"REQUEST_SIZE" //请求的大小

"FILETIME" //文件创建时间

"SSL_VERIFY_RESULT" //SSL验证结果

"REDIRECT_COUNT" //跳转技术

"TOTAL_TIME" //总耗时

"NAMELOOKUP_TIME" //DNS查询耗时

"CONNECT_TIME" //等待连接耗时

"PRETRANSFER_TIME" //传输前准备耗时

"SIZE_UPLOAD" //上传数据的大小

"SIZE_DOWNLOAD" //下载数据的大小

"SPEED_DOWNLOAD" //下载速度

"SPEED_UPLOAD" //上传速度

"DOWNLOAD_CONTENT_LENGTH" /下载内容的长度

"UPLOAD_CONTENT_LENGTH" //上传内容的长度

"STARTTRANSFER_TIME" //开始传输的时间

"REDIRECT_TIME" //重定向耗时

我们利用 CURLOPT_HTTPHEADER 选项来设定我们发送出的HTTP请求头信息(http headers),包括user agent信息和默认语言。然后我们来看看这些特定网站是否会把我们重定向到不同的URL。

以下为引用的内容:

// 测试用的URL

$urls = array(

"http://www.aaa.com",

"http://www.bbb.com",

"http://www.ccc.com"

);

$browsers = array(

"standard" => array (

"user_agent" => "Mozilla/5.0 (windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)",

"language" => "en-us,en;q=0.5"

),

"iphone" => array (

"user_agent" => "Mozilla/5.0 (iPhone; U; CPU like mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.3",

"language" => "en"

),

"french" => array (

"user_agent" => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)",

"language" => "fr,fr-FR;q=0.5"

)

);

foreach ($urls as $url) {

echo "URL: $urln";

foreach ($browsers as $test_name => $browser) {

$ch = curl_init();

// 设置 url

curl_setopt($ch, CURLOPT_URL, $url);

// 设置浏览器的特定header

curl_setopt($ch, CURLOPT_HTTPHEADER, array(

"User-Agent: {$browser['user_agent']}",

"Accept-Language: {$browser['language']}"

));

// 页面内容我们并不需要

curl_setopt($ch, CURLOPT_NOBODY, 1);

// 只需返回HTTP header

curl_setopt($ch, CURLOPT_HEADER, 1);

// 返回结果,而不是输出它

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$output = curl_exec($ch);

curl_close($ch);

// 有重定向的HTTP头信息吗?

if (preg_match("!Location: (.*)!", $output, $matches)) {

echo "$test_name: redirects to $matches[1]n";

} else {

echo "$test_name: no redirectionn";

}

}

echo "nn";

}

用POST方法发送数据

当发起GET请求时,数据可以通过查询字串(query string)传递给一个URL:

http://www.google.com/search?q=demo

这种情况下你可能并不需要cURL来模拟。把这个URL丢给“file_get_contents()”就能得到相同结果。

不过有一些HTML表单是用POST方法提交的。这种表单提交时,数据是通过 HTTP请求体(request body) 发送,而不是查询字串。例如,当使用CodeIgniter论坛的表单,无论你输入什么关键字,总是被POST到如下页面:

http://cc.com/a/b/

你可以用PHP脚本来模拟这种URL请求。首先,新建一个可以接受并显示POST数据的文件,我们给它命名为post_output.php:

print_r($_POST);

接下来,写一段PHP脚本来执行cURL请求:

以下为引用的内容:

$url = "http://localhost/post_demo.php";

$post_data = array (

"foo" => "bar",

"query" => "demo",

"action" => "Submit"

);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// 我们在POST数据哦!

curl_setopt($ch, CURLOPT_POST, 1);

// 把post的变量加上

curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);

$output = curl_exec($ch);

curl_close($ch);

echo $output;

这段脚本发送一个POST请求给 post_demo.php ,这个页面 $_POST 变量并返回输出。

文件上传

上传文件和前面的POST十分相似。因为所有的文件上传表单都是通过POST方法提交的。

首先新建一个接收文件的页面,命名为 upload_info.php:

print_r($_FILES);

以下为引用的内容:

$url = "http://localhost/upload_info.php";

$post_data = array (

"foo" => "bar",

// 要上传的本地文件地址

"upload" => "@C:/wamp/www/a.zip"

);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);

$output = curl_exec($ch);

curl_close($ch);

echo $output;

CURL功能原来这么强大,PHP大神都在用

 

如果你需要上传一个文件,只需要把文件路径像一个post变量一样传过去,不过记得在前面加上@符号。执行这段脚本应该会得到如下输出:

cURL批处理(multi cURL)

cURL还有一个高级特性——批处理句柄(handle)。这一特性允许你同时或异步地打开多个URL连接。

下面是来自来自php.net的示例代码:

以下为引用的内容:

// 创建两个cURL资源

$ch1 = curl_init();

$ch2 = curl_init();

// 指定URL和适当的参数

curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");

curl_setopt($ch1, CURLOPT_HEADER, 0);

curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");

curl_setopt($ch2, CURLOPT_HEADER, 0);

// 创建cURL批处理句柄

$mh = curl_multi_init();

// 加上前面两个资源句柄

curl_multi_add_handle($mh,$ch1);

curl_multi_add_handle($mh,$ch2);

// 预定义一个状态变量

$active = null;

// 执行批处理

do {

$mrc = curl_multi_exec($mh, $active);

} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {

if (curl_multi_select($mh) != -1) {

do {

$mrc = curl_multi_exec($mh, $active);

} while ($mrc == CURLM_CALL_MULTI_PERFORM);

}

}

// 关闭各个句柄

curl_multi_remove_handle($mh, $ch1);

curl_multi_remove_handle($mh, $ch2);

curl_multi_close($mh);

这里要做的就是打开多个cURL句柄并指派给一个批处理句柄。然后你就只需在一个while循环里等它执行完毕。

这个示例中有两个主要循环。第一个 do-while 循环重复调用 curl_multi_exec() 。这个函数是无隔断(non-blocking)的,但会尽可能少地执行。它返回一个状态值,只要这个值等于常量 CURLM_CALL_MULTI_PERFORM ,就代表还有一些刻不容缓的工作要做(例如,把对应URL的http头信息发送出去)。也就是说,我们需要不断调用该函数,直到返回值发生改变。

而接下来的 while 循环,只在 $active 变量为 true 时继续。这一变量之前作为第二个参数传给了 curl_multi_exec() ,代表只要批处理句柄中是否还有活动连接。接着,我们调用 curl_multi_select() ,在活动连接(例如接受服务器响应)出现之前,它都是被“屏蔽”的。这个函数成功执行后,我们又会进入另一个 do-while 循环,继续下一条URL。

HTTP 认证

如果某个URL请求需要基于 HTTP 的身份验证,你可以使用下面的代码:

复制内容到剪贴板代码:

以下为引用的内容:

CURL功能原来这么强大,PHP大神都在用

 

$url = "http://www.somesite.com/members/";

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// 发送用户名和密码

curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword");

// 你可以允许其重定向

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

// 下面的选项让 cURL 在重定向后

// 也能发送用户名和密码

curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1);

$output = curl_exec($ch);

curl_close($ch);

FTP 上传

PHP 自带有 FTP 类库, 但你也能用 cURL:

以下为引用的内容:

// 开一个文件指针

$file = fopen("/path/to/file", "r");

// url里包含了大部分所需信息

$url = "ftp://username:password@mydomain.com:21/path/to/new/file";

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// 上传相关的选项

curl_setopt($ch, CURLOPT_UPLOAD, 1);

curl_setopt($ch, CURLOPT_INFILE, $fp);

curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/to/file"));

// 是否开启ASCII模式 (上传文本文件时有用)

curl_setopt($ch, CURLOPT_FTPASCII, 1);

$output = curl_exec($ch);

curl_close($ch);



Tags:CURL   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
要在不使用图形界面的情况下从互联网上获取所需的信息,curl 是一种快速有效的方法。• 来源:linux.cn • 作者:Seth Kenlon • 译者:MjSeven •(本文字数:4904,阅...【详细内容】
2021-04-01  Tags: CURL  点击:(229)  评论:(0)  加入收藏
CURL是一个非常强大的开源库,它支持很多种协议,例如,HTTP、HTTPS、FTP、TELENT等。日常开发中,我们经常会需要用到curl向其他系统api访问。使用要想使用CURL,大致需要如下流程: 初...【详细内容】
2020-11-20  Tags: CURL  点击:(104)  评论:(0)  加入收藏
引言cURL是一种命令行实用程序,用于使用一种受支持的协议,从远程服务器传输数据,或将数据传输到远程服务器。默认情况下,已安装在macOS和大多数Linux发行版上。 开发人员可以使...【详细内容】
2020-07-26  Tags: CURL  点击:(97)  评论:(0)  加入收藏
概述最近在其中一台服务器碰到关于curl的报错:curl: (1) Protocol "https" not supported or disabled in libcurl,这里顺便记录下解决过程和思路~ 1、查看当前curl支持哪些协...【详细内容】
2020-06-26  Tags: CURL  点击:(127)  评论:(0)  加入收藏
1. 前言本文主要讲解如何在各种Linux发行版中安装curl命令。包括Ubuntu,Debian,RHEL,CentOS,Fedora,OpenSUSE,ArchLinux。如何在各种Linux发行版中安装curl命令在本文中,您将...【详细内容】
2020-06-23  Tags: CURL  点击:(93)  评论:(0)  加入收藏
命令概要该命令设计用于在没有用户交互的情况下工作。curl 是一个工具,用于传输来自服务器或者到服务器的数据。「向服务器传输数据或者获取来自服务器的数据」可支持的协议...【详细内容】
2020-05-12  Tags: CURL  点击:(60)  评论:(0)  加入收藏
curl 是一个很强大的命令行工具。你可以把 CURL 想象成一个精简的命令行网页浏览器。它支持几乎你能想到的所有协议,可以交互访问几乎所有在线内容。唯一和浏览器不同的是,c...【详细内容】
2020-04-07  Tags: CURL  点击:(93)  评论:(0)  加入收藏
curl是用于从远程服务器传输数据或向远程服务器传输数据的强大命令行工具。使用curl可以使用各种网络协议(例如HTTP,HTTPS,SCP,SFTP和FTP)下载或上传数据。如果在尝试下载带有cur...【详细内容】
2020-02-16  Tags: CURL  点击:(97)  评论:(0)  加入收藏
我认为使用 curl 构造 HTTP 请求也许就是这样的一项技能,所以这里有一些 curl 练习作为实验!-- Julia Evans(作者)最近,我对人们如何学习新事物感兴趣。我正在读 Kathy Sierra...【详细内容】
2019-12-05  Tags: CURL  点击:(61)  评论:(0)  加入收藏
今天有用户调用一个curl方法时,遇到如下的错误,查找了一些资料终于解决了。解决方法记录一下,留着自己以后自已查阅用。 错误代码cURL error 60: SSL certificate problem: una...【详细内容】
2019-10-24  Tags: CURL  点击:(133)  评论:(0)  加入收藏
▌简易百科推荐
序言:前段时间织梦因为版权的问题在网上闹得沸沸扬扬,也提醒了众多开发者选择cms上应该谨慎使用,今天给大家展示一款自己搭建的内容管理系统,不用担心版权的问题,而且非常容易维...【详细内容】
2021-11-30  小程序软件开发    Tags:管理系统   点击:(34)  评论:(0)  加入收藏
准备安装包(PHP: Hypertext Preprocessor)下载安装包以及组件wget https://www.php.net/distributions/php-8.0.0.tar.bz2wget https://github.com/phpredis/phpredis/archive...【详细内容】
2021-11-09  mimic96    Tags:PHP   点击:(40)  评论:(0)  加入收藏
golang context 很好用,就使用php实现了github地址 : https://github.com/qq1060656096/php-go-context context使用闭坑指南1. 将一个Context参数作为第一个参数传递给传入和...【详细内容】
2021-11-05  1060656096    Tags:PHP   点击:(41)  评论:(0)  加入收藏
一段数组为例:$list = array:4 [ 0 => array:7 [ "id" => 56 "mer_id" => 7 "order_id" => "wx163265961408769974" "is_postage" => 0 "store_name" => "奇...【详细内容】
2021-09-29  七七小影视    Tags:PHP   点击:(65)  评论:(0)  加入收藏
利用JS的CryptoJS 3.x和PHP的openssl_encrypt,openssl_decrypt实现AES对称加密解密,由于需要两种语言对同一字符串的操作,而CryptoJS 的默认加密方式为“aes-256-cbc”,PHP端也...【详细内容】
2021-09-16  李老师tome    Tags:对称加密   点击:(79)  评论:(0)  加入收藏
1、checkdate()验证格利高里日期即:日期是否存在。checkdate(month,day,year);month必需。一个从 1 到 12 的数字,规定月。day必需。一个从 1 到 31 的数字,规定日。year必需。...【详细内容】
2021-08-31  七七小影视    Tags:时间函数   点击:(80)  评论:(0)  加入收藏
对于各类开发语言来说,整数都有一个最大的位数,如果超过位数就无法显示或者操作了。其实,这也是一种精度越界之后产生的精度丢失问题。在我们的 PHP 代码中,最大的整数非常大,我...【详细内容】
2021-08-26  硬核项目经理    Tags:PHP   点击:(83)  评论:(0)  加入收藏
遵从所有教材以及各类数据结构相关的书书籍,我们先从线性表开始入门。今天这篇文章更偏概念,是关于有线性表的一个知识点的汇总。上文说过,物理结构是用于确定数据以何种方式存...【详细内容】
2021-07-19  硬核项目经理    Tags:线性表   点击:(94)  评论:(0)  加入收藏
一、开启IIS全部功能。二、部署PHP1.官网下载并解压PHP: https://windows.php.net/downloads/releases/2.将php.ini-development文件改为php.ini3.修改php.ini(1)去掉注释,并修...【详细内容】
2021-07-15  炘蓝火诗  今日头条  Tags:PHP环境   点击:(129)  评论:(0)  加入收藏
一、环境说明本文中使用本地VM虚机部署测试。OS:CentOS Linux release 7.8.2003 (Core)虚机配置:2核CPU、4G内存①系统为CentOS 7.8 x64最小化安装,部署前已完成系统初始化、...【详细内容】
2021-06-25  IT运维笔记  今日头条  Tags:PHP8.0.7   点击:(141)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条