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* ...
随机推荐
- 微信开发 :WeixinPayInfoCollection尚未注册Mch 问题解决
在使用开源项目 SENPARC.WEIXIN SDK 调用微信支付接口的时候出现了WeixinPayInfoCollection尚未注册Mch,这个问题. 最后地解决方案是: 我这个傻逼忘了在全局Gl ...
- Autofac - 属性注入
属性注入不同于通过构造函数方式传入参数. 这里是通过注入的方式, 在类创建完毕之后, 资源释放之前, 给属性赋值. 这里, 我重新弄一些类来演示这一篇吧. public class ClassA { ...
- Maven 代理设置
在maven的安装目录下 %MAVEN_HOME%/conf/setting.xml 中进行设置 <proxies> <!-- proxy | Specificatio ...
- maven 中snapshot版本和release版本的区别
maven中的仓库分为两种,snapshot快照仓库和release发布仓库.snapshot快照仓库用于保存开发过程中的不稳定版本,release正式仓库则是用来保存稳定的发行版本.定义一个组件/模 ...
- Spring配置文件标签报错:The prefix "XXX" for element "XXX:XXX" is not bound. .
例如:The prefix "context" for element "context:annotation-config" is not bound. 这种 ...
- ES6之变量常量字符串数值
ECMAScript 6 是 JavaScript 语言的最新一代标准,当前标准已于 2015 年 6 月正式发布,故又称 ECMAScript 2015. ES6对数据类型进行了一些扩展 在js中使 ...
- js格式化日期
/** *对日期进行格式化, * @param date 要格式化的日期 * @param format 进行格式化的模式字符串 * 支持的模式字母有: * y:年, * M:年中的月份(1-12), ...
- Xamarin体验:使用C#开发iOS/Android应用
Xamarin是Mono创始人Miguel de Icaza创建的公司,旨在让开发者可以用C#编写iOS, Android, Mac应用程序,也就是跨平台移动开发. 简介 Xamarin是基于Mo ...
- 【腾讯Bugly干货分享】程序员们也该知道的事——“期权和股票”
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/pfj9NLLuKYAfJJF84R9WAw 作者:B ...
- Handlebars 模板引擎之前后端用法
前言 不知不觉间,居然已经这么久没有写博客了,坚持还真是世界上最难的事情啊. 不过我最近也没闲着,辞工换工.恋爱失恋.深圳北京都经历了一番,这有起有落的生活实在是太刺激了,就如拿着两把菜刀剁洋葱一样, ...