下面的代码有点复杂了,因此我将一小步一小步地详细解释:
以下为引用的内容:
// 1. 批处理器
$mh = curl_multi_init();
// 2. 加入需批量处理的URL
for ($i = 0; $i < $max_connections; $i++) {
add_url_to_multi_handle($mh, $url_list);
}
// 3. 初始处理
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
// 4. 主循环
while ($active && $mrc == CURLM_OK) {
// 5. 有活动连接
if (curl_multi_select($mh) != -1) {
// 6. 干活
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
// 7. 有信息否?
if ($mhinfo = curl_multi_info_read($mh)) {
// 意味着该连接正常结束
// 8. 从curl句柄获取信息
$chinfo = curl_getinfo($mhinfo['handle']);
// 9. 死链么?
if (!$chinfo['http_code']) {
$dead_urls []= $chinfo['url'];
// 10. 404了?
} else if ($chinfo['http_code'] == 404) {
$not_found_urls []= $chinfo['url'];
// 11. 还能用
} else {
$working_urls []= $chinfo['url'];
}
// 12. 移除句柄
curl_multi_remove_handle($mh, $mhinfo['handle']);
curl_close($mhinfo['handle']);
// 13. 加入新URL,干活
if (add_url_to_multi_handle($mh, $url_list)) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
}
}
// 14. 完了
curl_multi_close($mh);
echo "==Dead URLs==\n";
echo implode("\n",$dead_urls) . "\n\n";
echo "==404 URLs==\n";
echo implode("\n",$not_found_urls) . "\n\n";
echo "==Working URLs==\n";
echo implode("\n",$working_urls);
// 15. 向批处理器添加url
function add_url_to_multi_handle($mh, $url_list) {
static $index = 0;
// 如果还剩url没用
if ($url_list[$index]) {
// 新建curl句柄
$ch = curl_init();
// 配置url
curl_setopt($ch, CURLOPT_URL, $url_list[$index]);
// 不想输出返回的内容
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 重定向到哪儿我们就去哪儿
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
// 不需要内容体,能够节约带宽和时间
curl_setopt($ch, CURLOPT_NOBODY, 1);
// 加入到批处理器中
curl_multi_add_handle($mh, $ch);
// 拨一下计数器,下次调用该函数就能添加下一个url了
$index++;
return true;
} else {
// 没有新的URL需要处理了
return false;
}
}
下面解释一下以上代码。列表的序号对应着代码注释中的顺序数字。
新建一个批处理器。Created a multi handle.
稍后我们将创建一个把URL加入批处理器的函数 add_url_to_multi_handle() 。每当这个函数被调用,就有一个新url被加入批处理器。一开始,我们给批处理器添加了10个URL(这一数字由 $max_connections 所决定)。
运行 curl_multi_exec() 进行初始化工作是必须的,只要它返回 CURLM_CALL_MULTI_PERFORM 就还有事情要做。这么做主要是为了创建连接,它不会等待完整的URL响应。
只要批处理中还有活动连接主循环就会一直持续。
curl_multi_select() 会一直等待,直到某个URL查询产生活动连接。
cURL的活儿又来了,主要是获取响应数据。
检查各种信息。当一个URL请求完成时,会返回一个数组。
在返回的数组中有一个 cURL 句柄。我们利用其获取单个cURL请求的相应信息。
如果这是一个死链或者请求超时,不会返回http状态码。
如果这个页面找不到了,会返回404状态码。
其他情况我们都认为这个链接是可用的(当然,你也可以再检查一下500错误之类...)。
从该批次移除这个cURL句柄,因为它已经没有利用价值了,关了它!
很好,现在可以另外加一个URL进来了。再一次地,初始化工作又开始进行...
嗯,该干的都干了。关闭批处理器,生成报告。
回过头来看给批处理器添加新URL的函数。这个函数每调用一次,静态变量 $index 就递增一次,这样我们才能知道还剩多少URL没处理。
我把这个脚本在我的博客上跑了一遍(测试需要,有一些错误链接是故意加上的),结果如下:
以下为引用的内容:
<img border="0" src="http://nettuts.s3.cdn.plus.org/534_curl/ss_4.png" />
共检查约40个URL,只耗费两秒不到。当需要检查更加大量的URL时,其省心省力的效果可想而知!如果你同时打开10个连接,还能再快上10倍!另外,你还可以利用cURL批处理的无隔断特性来处理大量URL请求,而不会阻塞你的Web脚本。
另一些有用的cURL 选项
HTTP 认证
如果某个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);
Fan墙术
你可以用代理发起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响应接收的过程中,只要收到一个数据包,这个函数就会被调用。
小结
今天我们一起学习了cURL库的强大功能和灵活的扩展性。希望你喜欢。下一次要发起URL请求时,考虑下cURL吧!
原文:基于PHP的cURL快速入门
英文原文:http://net.tutsplus.com/tutorial%20...%20for-mastering-curl/
原文作者:Burak Guzel
本文链接:http://www.blueidea.com/tech/program/2010/7348.asp
分享到:
相关推荐
基于PHP的cURL快速入门基于PHP的cURL快速入门
基于PHP的cURL快速入门.pdf 基于PHP的cURL快速入门.pdf 基于PHP的cURL快速入门.pdf 基于PHP的cURL快速入门.pdf 基于PHP的cURL快速入门.pdf
基于PHP的cURL快速入门
cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。很多小偷程序都是使用这个函数。
:elephant: 基于PHP的下载加速器 :fast_down_button: 入门 该库可作为作曲家软件包使用。 将在每个发行版中添加独立版本。 先决条件 您只需要php(具有curl和mbstring扩展名)和作曲家。 安装和使用 使用作曲家进行...
配置好了之后,系统会返回 index.php页面,你就可以开始 php sdk 的入门体验咯。 下面这些话是对coder说的: 代码结构采用api对应的目录,每个api对应相同文件名的PHP文件。代码中涉及到POST操作的部分,分为前...
快速入门MiniFramework快速入门学习文档: : 安装部署通过Composer可以快速安装部署一个基于MiniFramework的基础应用模板,开发者可以通过这个模板快速开始构建自己的Web应用。1.安装作曲家如果已经安装好了Composer...
普斯托克 Pushok是一个简单PHP库,用于向APN发送推送通知。 特征 ... 支持基于JWT的身份验证 支持基于证书的身份验证 ...入门 使用JWT令牌。 有关更多信息,请参见。 <?php require __DIR__ . '/vendor/autoload.p
入门 要求 锈 通过shell脚本安装Rust curl https://sh.rustup.rs -sSf | sh 安装后,您可能需要 source $HOME /.cargo/env 由于此项目基于Rocket构建,而Rocket每晚依赖于Rust,因此您需要将Rust环境更改为每
使用cURL或唯一逻辑脚本绕过读取文件/etc/passwd 很多其他有趣的东西:) 入门 git clone https://github.com/KeepWannabe/Remot3d cd Remot3d sudo setup.sh && Remot3d 推荐Linux操作系统: Linux Mint(基于...
用于 ZF 2 的基于 ORM 的 RbacUser 模块 RbacUserDoctrineOrm 提供了一个模块,它将 ZfcRbac & ZfcUser 与 ZF2 的 Doctrine Orm 模块结合在一起,以便您可以专注于入门。 需求及其依赖 PHP 5.3 或更高版本 安装 ...
FedoroProxy 可帮助您开发基于 php 的 Fedora Commons 客户端。 它使用 fedora commons REST API。 它使用 curl 进行 REST 通信。 支持以下方法:API-A 方法: 查找对象查找命名空间API-M 方法创建Foxml 获取下一个...
它基于并在标准版捆绑软件的基础上添加了所有与cmf相关的捆绑软件。 链接到 入门 您可以在系统上或使用Vagrant在virtualbox VM中运行沙箱。 对于后者,请参阅“开始使用Vagrant” 你会需要: PHP 5.3.9+(带有...