php中实现的一个curl批处理的实例
curl是利用URL语法在命令行方式下工作的开源文件传输工具
本文在php中实现了的一个curl批处理的实例。
代码如下:
header("Content-Type:text/html;charset=utf8");
/* 先获取两个页面的所有a标签 */
// 初始化两个简单处理句柄
$ch1 = curl_init();
$ch2 = curl_init();
curl_setopt_array($ch1,array(
CURLOPT_URL => 'http://www.sina.com.cn',
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
));
curl_setopt_array($ch2,array(
CURLOPT_URL => 'http://www.baidu.com/',
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
));
// 初始化批处理句柄,并添加简单处理句柄
$mh = curl_multi_init();
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
// 初始化执行状态
$state = null;
// 执行批处理
do{
$mc = curl_multi_exec($mh,$state);
}while($mc == CURLM_CALL_MULTI_PERFORM);
while($mc == CURLM_OK && $state) {
while (curl_multi_exec($mh, $state) === CURLM_CALL_MULTI_PERFORM);
// 经过实验,发现curl_multi_select($mh)总是返回-1,意味着一下代码不会执行
if(curl_multi_select($mh) != -1) {
do{
$mc = curl_multi_exec($mh,$state);
}while($mc == CURLM_CALL_MULTI_PERFORM);
}
}
// 获取内容
$text = curl_multi_getcontent($ch1);
$text .= curl_multi_getcontent($ch2);
// 找到页面中所有的a标签,保存到$matches
$matches = null;
preg_match_all("/<a.*?href\s*?=\s*?[\'\"](.*?)[\'\"].*?>(.*?)<\/a>/",$text,$matches);
// 关闭各个句柄
curl_multi_remove_handle($mh,$ch1);
curl_multi_remove_handle($mh,$ch2);
curl_multi_close($mh);
/*在找到的连接中继续查找title标签 */
$handle = array(); // 存储简单处理句柄的数组
$mhandle = curl_multi_init(); //批处理句柄
// 处理100个页面
foreach(array_slice($matches[1],0,100) as $href) {
$tmp_h = curl_init();
curl_setopt_array($tmp_h,array(
CURLOPT_URL => $href,
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
));
curl_multi_add_handle($mhandle,$tmp_h);
$handle[] = $tmp_h;
}
do{
$mrc = curl_multi_exec($mhandle,$active);
}while($mrc == CURLM_CALL_MULTI_PERFORM);
while($mrc == CURLM_OK && $active) {
while(curl_multi_exec($mhandle,$active) == CURLM_CALL_MULTI_PERFORM);
if(curl_multi_select($mhandle) != -1) {
do{
$mrc = curl_multi_exec($mhandle,$active);
}while($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
// 获取这些页面的内容
$mtext = null;
foreach($handle as $tmp_h) {
$mtext .= curl_multi_getcontent($tmp_h);
curl_multi_remove_handle($mhandle, $tmp_h);
}
$mmatches = array();
preg_match_all("/<title>(.*?)<\/title>/",$mtext, $mmatches);
// 编码转换
mb_detect_order('GB2312,GBK,BIG5,GB18030,UNICODE ,CP936');
foreach($mmatches[1] as $key => $val) {
$encoding = mb_detect_encoding($val);
if($encoding != 'UTF-8' && $encoding != 'CP936' && $encoding != 'GB18030' && $encoding !='') {
$mmatches[1][$key] = iconv($encoding,'UTF-8//IGNORE',$val);
}
}
// 打印title信息
var_dump($mmatches[1]);
// 关闭批处理句柄
curl_multi_close($mhandle);
php中实现的一个curl批处理的实例的更多相关文章
- Python中如何开发一个注册接口小实例
import flask from flask import request #想获取到请求参数的话,就得用这个 server = flask.Flask(__name__) #吧这个python文件 ...
- java中使用JDBC的preparedStatement批处理数据的添加
在项目中我们偶尔可能会遇到批量向数据库中导入数据,如果批处理的情况较多的情况下可以使用spring batch,如果只是一个导入功能的话可以考虑使用jdbc的preparedStatement处理. ...
- Java中使用多线程、curl及代理IP模拟post提交和get访问
Java中使用多线程.curl及代理IP模拟post提交和get访问 菜鸟,多线程好玩就写着玩,大神可以路过指教,小弟在这受教,谢谢! 更多分享请关注微信公众号:lvxing1788 ~~~~~~ 分 ...
- php curl批处理--可控并发异步
通常情况下 PHP 中的 cURL 是阻塞运行的,就是说创建一个 cURL 请求以后必须等它执行成功或者超时才会执行下一个请求:API接口访问一般会首选CURL 在实际项目或者自己编写小工具(比如新闻 ...
- Java中使用多线程、curl及代理IP模拟post提交和get訪问
Java中使用多线程.curl及代理IP模拟post提交和get訪问 菜鸟,多线程好玩就写着玩.大神能够路过不吝赐教.小弟在这受教.谢谢! 很多其它分享请关注微信公众号:lvxing1788 ~~~~ ...
- 今天我自己第一次写了一个Windows批处理bat脚本,一起学习一下吧。
今天我自己第一次写了一个Windows批处理bat脚本,备注一下 事情原由:自己使用Java开发了一个加解密的工具.但是当把工具给别人使用的时候,别人还需要把代码编译打包, 然后还需要看一下代码里面的 ...
- 【转】 C#中Finally的一个不太常见的用法
原文地址:http://www.cnblogs.com/listhome/p/3664300.html 最近在看.net BCL 传送门 的源码. 在 System.Collections.Concu ...
- SQL Server 中怎么查看一个字母的ascii编码或者Unicode编码
参考文章:微信公众号文章 在sql中怎么查看一个字符的ascii编码,so easy !! select ASCII('a') SELECT CHAR(97) charNum SELECT UNICO ...
- 当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式。
当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式.比如 select * from T_Employee where FNumber not in ( select top 5* ...
随机推荐
- 【开源毕设】一款精美的家校互动APP分享——爱吖校推 [你关注的,我们才推](持续开源更新3)附高效动态压缩Bitmap
一.写在前面 爱吖校推如同它的名字一样,是一款校园类信息推送交流平台,这么多的家校互动类软件,你选择了我,这是我的幸运.从第一次在博客园上写博客到现在,我一次一次地提高博文的质量和代码的可读性,都是为 ...
- Spring cache简单使用guava cache
Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...
- EF上下文对象线程内唯一性与优化
在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,这也加是很多人的代码中习惯在使用上下文对象时,习惯将对象建立在using中,也是为了尽早释放上下文对象, 但是如果有一个业务逻辑调用 ...
- SharePoint 2013管理中心里【管理服务器上的服务】不见了
打开管理中心,准备配置Managed Metadata Service,发现"管理服务器上的服务"不见了 那我自己拼url直接访问:http://xxxx/_admin/Serve ...
- atitit.attilax的软件 架构 理念.docx
atitit.attilax的软件 架构 理念.docx 1. 预先规划.1 2. 全体系化1 3. 跨平台2 4. 跨语言2 5. Dsl化2 5.1. 界面ui h5化2 6. 跨架构化2 7. ...
- SVN版本冲突,导致出现Files 的值“ < < < < < < < .mine”无效
只要根据错误提示,找到相应文件夹下的\obj\Debug文件夹下的 相应名字.csproj.FileListAbsolute.txt, 打开并删除含有'<<<<<< ...
- 【Java并发编程实战】-----“J.U.C”:Phaser
Phaser由java7中推出,是Java SE 7中新增的一个使用同步工具,在功能上面它与CyclicBarrier.CountDownLatch有些重叠,但是它提供了更加灵活.强大的用法. Cyc ...
- ABP框架 - 动态Web Api层
文档目录 本节内容: 创建动态Web Api控制器 ForAll 方法 重写 ForAll ForMethods Http 动词 WithVerb 方法 HTTP 特性 命名约定 Api 浏览器 Re ...
- 关于python中的flush问题
今天写了一个控制台下的进度条小程序,遇到了关于flush的问题,在这里小小的总结一下. 首先在要flush的字符串必须后边加上'\r'(回车) 将数据送入缓冲区这样在新打印字符的时候就可以将原来的显示 ...
- iOS App引导页功能实现
一.写作原因 以前都没有想着来写点东西,今天遇到件事情让我决定每次还是要做记录.因为以前自己可以轻松的完成pod spec的配置,但是今天在做的时候还是忘了遇到了很多坑.pod spec配置遇到的坑不 ...