`
hudeyong926
  • 浏览: 2032927 次
  • 来自: 武汉
社区版块
存档分类
最新评论

CURL HTTP请求类

 
阅读更多

CURL fopen file_get_contents

fopen /file_get_contents 每次请求都会重新做DNS查询,并不对DNS信息进行缓存。但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。这大大减少了DNS查询的次数。所以CURL的性能比fopen /file_get_contents 好很多。
fopen /file_get_contents在请求HTTP时,使用的是http_fopen_wrapper,不会keeplive。而curl却可以。这样在多次请求多个链接时,curl效率会好一些。
fopen / file_get_contents函数会受到php.ini文件中allow_url_open选项配置的影响。如果该配置关闭了,则该函数也就失效了。而curl不受该配置的影响。
curl可以模拟多种请求,而fopen / file_get_contents只能使用get方式获取数据。
PS:file_get_contents()函数获取https链接内容的时候,需要php 中mod_ssl的支持(或安装opensll)。

一 什么是CURL
curl是一个利用URL语法在命令行方式下工作的文件传输工具。curl是一个利用URL语法在命令行方式下工作的文件传输工具。它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。curl同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证, HTTP上传, 代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传, http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器, 通过http代理服务器上传文件到FTP服务器等等,功能十分强大。

修改php.ini文件,找到;extension= php_curl.dll行 ,去掉前面的;号,保存,重启服务器


基本结构

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

// 1. 初始化
$ch = curl_init();
// 2. 设置选项,包括URL
curl_setopt($ch, CURLOPT_URL, "http://www.nettuts.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_setopt() )最为重要,一切玄妙均在此 。有一长串CURL参数可供设置,它们能指定URL请求的各个细节。要一次性全部看完并理解可能比较困难,所以今天我们只试一下那些更常用也更有用的选项。

检查错误

你可以加一段检查错误的语句(虽然这并不是必需的):

// ...
$output = curl_exec($ch);
if ($output === FALSE) {
    echo "cURL Error: " . curl_error($ch);
}
// ...

请注意,比较的时候我们用的是“=== FALSE”,而非“== FALSE”。因为我们得区分 空输出 和 布尔值FALSE,后者才是真正的错误。

 

获取信息

这是另一个可选的设置项,能够在cURL执行后获取这一请求的有关信息:

// ...
curl_exec($ch);
$info = curl_getinfo($ch);
echo '获取'. $info['url'] . '耗时'. $info['total_time'] . '秒';
// ...

基于浏览器的重定向

在第一个例子中,我们将提供一段用于侦测服务器是否有基于浏览器的重定向的代码。例如,有些网站会根据是否是手机浏览器甚至用户来自哪个国家来重定向网页。

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

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "User-Agent: {$browser['user_agent']}",
    "Accept-Language: {$browser['language']}"
));

首先,我们建立一组需要测试的URL,接着指定一组需要测试的浏览器信息。最后通过循环测试各种URL和浏览器匹配可能产生的情况。

因为我们指定了cURL选项,所以返回的输出内容则只包括HTTP头信息(被存放于 $output 中)。利用一个简单的正则,我们检查这个头信息中是否包含了“Location:”字样。

运行这段代码应该会返回如下结果:

cURL批处理(multi cURL)http://hudeyong926.iteye.com/blog/1635386

抓取一些有页面访问控制的页面

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

代码:

$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);

使用代理进行抓取

你可以用代理发起cURL请求:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://www.example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 指定代理地址
curl_setopt($ch, CURLOPT_PROXY, '11.11.11.11:8080');
// 如果需要的话,提供用户名和密码
curl_setopt($ch, CURLOPT_PROXYUSERPWD,'user:pass');
$output = curl_exec($ch);
curl_close ($ch);

 

回调函数

可以在一个URL请求过程中,让cURL调用某指定的回调函数。例如,在内容或者响应下载的过程中立刻开始利用数据,而不用等到完全下载完。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://net.tutsplus.com');
curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function");
curl_exec($ch);
curl_close ($ch);
function progress_function($ch,$str) {
    echo $str;
    return strlen($str);
}

这个回调函数必须返回字串的长度,不然此功能将无法正常使用。

在URL响应接收的过程中,只要收到一个数据包,这个函数就会被调用。

 

PHP中CURL使用POST提交XML数据

$header[] = "Content-type: text/xml";//定义content-type为xml
$header[] = 'Accept-Charset: utf-8';
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//定义请求类型

得到curl HTTP请求码.分离header和body信息。一是通过curl自带的curl_getinfo()方法获取头的长度,然后使用substr来分割字符串。示例代码如下:

if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == '200') {
    $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    $header = substr($response, 0, $headerSize);
    $body = substr($response, $headerSize);
}

上面的基本用法了解了,下面我就实例演示一次:

先通过浏览器正常访问网址https://www.innotree.cn/inno/database/totalDatabase,拿到伪装信息header,参数等

$ch = curl_init();
$url = "https://www.innotree.cn/inno/search/ajax/getAllSearchResult?query=&tagquery=&st=1&ps=10&areaName=&rounds=&show=0&idate=&edate=&cSEdate=-1&cSRound=-1&cSFdate=1&cSInum=-1&iSNInum=1&iSInum=-1&iSEnum=-1&iSEdate=-1&fchain=";
// 设置浏览器的特定header
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Host: www.innotree.cn",
    "Connection: keep-alive",
    "X-Requested-With: XMLHttpRequest",
    "Referer: https://www.innotree.cn/inno/database/totalDatabase",
    "Accept: application/json, text/javascript, */*; q=0.01",
    "Cookie:_user_identify_=134a6349-e4db-3ac1-83a2-9c42a59c265c; JSESSIONID=aaao4DPqtMQZV49BIjBdw; Hm_lvt_37854ae85b75cf05012d4d71db2a355a=1515503368; Hm_lpvt_37854ae85b75cf05012d4d71db2a355a=1515507433; Hm_lvt_ddf0d99bc06024e29662071b7fc5044f=1515503368; Hm_lpvt_ddf0d99bc06024e29662071b7fc5044f=1515507433; uID=462030; sID=4527c630998f758cdee8031ce8a256d2",
));
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0');
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_ENCODING, "gzip, deflate, br");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //302redirect
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
$html = curl_exec($ch);
curl_close($ch);
exit(json_decode($html, 1));

 使用非80端口

curl_setopt($ch, CURLOPT_PORT, 46961);

 ww

  • 大小: 30 KB
  • 大小: 68.2 KB
分享到:
评论
1 楼 chenzrm 2012-04-12  
测试了一下检查死链的那个,发现会有一些url未处理到。比如有30条url,结果中却只有20多条。

相关推荐

    php curl批量请求url

    它允许程序员模拟浏览器的行为,发送GET、POST等不同类型的HTTP请求,甚至可以处理HTTPS、cookies、HTTP头等复杂情况。本篇文章将深入探讨如何使用PHP的cURL库进行批量URL请求,并关注可能遇到的问题及解决方案。 ...

    CUrlHttp封装curl类

    CUrlHttp封装curl类是一个基于curl库的PHP类,它为开发者提供了更加便捷的方式来执行HTTP请求,如GET、POST以及表单提交等操作。curl库是一个强大的URL传输库,广泛应用于各种网络请求任务,包括文件上传下载、网页...

    用CURL来发送HTTP请求的方法

    ### 使用CURL发送HTTP请求详解 #### 一、引言 CURL,作为一个多功能的命令行工具,广泛应用于网络开发和脚本编程中,尤其在处理HTTP请求时表现出了强大的功能。本文旨在深入探讨如何利用CURL来发送HTTP请求,包括...

    Windows使用curl发送http请求,json报文。

    Windows使用curl发送http请求,json报文。

    curlAction.class_oracle_phpCURL请求类_

    `curlAction.class_oracle_phpCURL请求类` 的标题暗示了这个类可能特别关注于与 Oracle 数据库相关的 HTTP 请求处理。Oracle 数据库通常用于处理大规模的企业级数据,而通过 PHP 的 `cURL` 实现与数据库的接口通信,...

    Qt工程中使用curl进行网络请求,最小程序

    在本文中,我们将深入探讨如何在Qt工程中利用curl库进行网络请求,这是一个最小化的示例,可以帮助开发者了解如何将curl集成到Qt项目中。首先,让我们了解一下curl库和Qt框架的基本概念。 **curl库介绍** curl是一...

    android jni使用curl进行http请求和文件下载

    在本案例中,我们将讨论如何在Android JNI中使用libcurl库来执行HTTP请求和文件下载。 libcurl是一个流行的开源库,用于处理各种网络协议,包括HTTP、HTTPS等。它提供了丰富的API,可以在多种编程语言中使用,包括C...

    curl请求类.zip

    `curl请求类.zip`是一个包含用于执行HTTP请求的CURL类的压缩包。CURL,全称“Client URL Library”,是一个强大的开源库,允许开发者在各种编程语言中发送网络请求,支持多种协议,如HTTP、HTTPS、FTP、FTPS等。这个...

    用CURL来发送HTTP请求

    ### 使用CURL发送HTTP请求详解 #### 一、CURL简介与HTTP协议 **CURL**(Client URL)是一款强大的命令行工具,用于处理URL,包括获取或发送数据。它支持多种协议,如HTTP、HTTPS、FTP等,并且可以在各种操作系统上...

    curl库做http请求

    3. **C++代码实现**:在对应的C++源文件中,实现这些JNI接口,调用curl库的函数来执行HTTP请求。例如,你可以设置URL、请求方法、头信息、POST数据等。 4. **错误处理**:由于curl库的错误处理是通过返回值和全局...

    简单使用curl进行get请求并将服务器返回存进本地文件

    总结,`curl` 是一个功能强大的工具,可以方便地执行HTTP请求并处理响应。通过学习和熟练使用`curl`的各种选项,你可以在命令行环境中高效地进行Web服务的测试和数据抓取。在实际工作中,`curl`经常被开发者用来快速...

    pcap2curl读取数据包捕获提取HTTP请求并将其转换为cURL命令进行重放

    `pcap2curl`是一个实用工具,它专注于从`.pcap`文件(数据包捕获文件)中提取HTTP请求,并将这些请求转换成可执行的cURL命令,以便于重放请求,这对于测试、调试和爬虫工作流特别有用。以下是对`pcap2curl`的详细...

    Go-golang版本的curl请求库

    `curl`命令行工具在这一领域非常流行,它提供了丰富的选项来构造和发送HTTP请求。然而,在实际的Go程序中,我们不能直接使用`curl`,这时就需要一个类似的库来实现相同的功能。"Go-golang版本的curl请求库"就是这样...

    cocos2d-x curl联网

    在实际开发中,`AAACurlHttp`可能是你封装的curl HTTP请求类的名称,它可能包含处理网络请求的全部逻辑,包括请求的发起、数据的接收、错误处理以及与其他Cocos2d-x组件(如场景、节点)的交互。 总之,结合Cocos2d...

    CURL HTTP POST方式表单递交

    1、使用的是curl库,数据采用http post方式表单递交 2、里面有完整的注释,比较规则的代码结构,适合学习交流 3、是控制台程序 4、我也是用到了curl但网上的资料大部分比较松散,我自己实现后分享给大家,相互学习,...

    http请求处理PHP类.zip

    这个"HTTP请求处理PHP类.zip"包含了一个用CURL库封装的类,方便开发者更高效、简洁地实现GET、POST请求以及多URL并行请求。下面我们将深入探讨这个类可能包含的关键功能和原理。 首先,CURL(Client URL Library)...

    Qt工程中用curl发送post请求,发送json返回json

    在Qt工程中,使用curl库发送POST请求并处理JSON数据是一项常见的任务,特别是在与Web服务交互时。这里我们将深入探讨如何实现这一功能。 首先,`curl`是一个强大的命令行工具和库,用于传输数据,支持多种协议,...

    curl, 用于发出异步HTTP请求的PHP 5.4 库.zip

    curl, 用于发出异步HTTP请求的PHP 5.4 库 现在,这个存储库不再主动开发。 这是一个有趣的旅程,但现在有更好的图书馆。 如果有人想接管项目的进一步发展,让我知道 ! jyggen/curl jyggen/curl是一个用于进行异步...

Global site tag (gtag.js) - Google Analytics