Rumah  >  Artikel  >  pembangunan bahagian belakang  >  基于PHP的cURL快速入门三

基于PHP的cURL快速入门三

WBOY
WBOYasal
2016-06-13 13:03:27841semak imbas

基于PHP的cURL快速入门3

下面的代码有点复杂了,因此我将一小步一小步地详细解释:

以下为引用的内容:

// 1. 批处理器
$mh = curl_multi_init();
// 2. 加入需批量处理的URL
for ($i = 0; $i 
<p>?<br><br><br>下面解释一下以上代码。列表的序号对应着代码注释中的顺序数字。<br>新建一个批处理器。Created a multi handle. <br>稍后我们将创建一个把URL加入批处理器的函数 add_url_to_multi_handle() 。每当这个函数被调用,就有一个新url被加入批处理器。一开始,我们给批处理器添加了10个URL(这一数字由 $max_connections 所决定)。 <br>  运行 curl_multi_exec()  进行初始化工作是必须的,只要它返回 CURLM_CALL_MULTI_PERFORM 就还有事情要做。这么做主要是为了创建连接,它不会等待完整的URL响应。 <br>只要批处理中还有活动连接主循环就会一直持续。 <br>curl_multi_select() 会一直等待,直到某个URL查询产生活动连接。 <br>cURL的活儿又来了,主要是获取响应数据。 <br>检查各种信息。当一个URL请求完成时,会返回一个数组。 <br>在返回的数组中有一个 cURL 句柄。我们利用其获取单个cURL请求的相应信息。 <br>如果这是一个死链或者请求超时,不会返回http状态码。 <br>如果这个页面找不到了,会返回404状态码。 <br>其他情况我们都认为这个链接是可用的(当然,你也可以再检查一下500错误之类...)。 <br>从该批次移除这个cURL句柄,因为它已经没有利用价值了,关了它! <br>很好,现在可以另外加一个URL进来了。再一次地,初始化工作又开始进行... <br>嗯,该干的都干了。关闭批处理器,生成报告。 <br>回过头来看给批处理器添加新URL的函数。这个函数每调用一次,静态变量 $index 就递增一次,这样我们才能知道还剩多少URL没处理。 <br><br>我把这个脚本在我的博客上跑了一遍(测试需要,有一些错误链接是故意加上的),结果如下:<br><br>以下为引用的内容:</p>
<pre name="code" class="html"><img  border="0" src="http://nettuts.s3.cdn.plus.org/534_curl/ss_4.png" alt=" 基于PHP的cURL快速入门三 " >

?



共检查约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
Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn