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* ...
随机推荐
- js学习之类型识别
用来判别类型的方法有好多,整理了一下4种方法,平时用的时候,在不同情景下,还是要结合着使用的. 方法一 typeof:可以识别标准类型,除了Null:不能识别具体的对象类型,除了Function &l ...
- J a v a 的“多重继承”
接口只是比抽象类“更纯”的一种形式.它的用途并不止那些.由于接口根本没有具体的实施细节——也就是说,没有与存储空间与“接口”关联在一起——所以没有任何办法可以防止多个接口合并到一起.这一点是至关重要的 ...
- WPF 捕获键盘输入事件
最近修改的一个需求要求捕获键盘输入的 Text,包括各种标点符号. 最开始想到的是 PreviewKeyDown 或者 PreviewKeyUp 这样的键盘事件. 但是这两个事件的对象 KeyEven ...
- 【干货分享】流程DEMO-费用报销
流程名: 费用报销 业务描述: 流程发起时,要选择需要关联的事务审批单,会检查是否超申请,如果不超申请,可以直接发起流程,如果超了申请,需要检查预算,如果预算不够,将不允许发起报销申请,如果预算够用, ...
- Android 死锁和重入锁
死锁的定义: 1.一般的死锁 一般的死锁是指多个线程的执行必须同时拥有多个资源,由于不同的线程需要的资源被不同的线程占用,最终导致僵持的状态,这就是一般死锁的定义. package com.cxt.t ...
- IIS启动失败,启动Windows Process Activation Service时,出现错误13:数据无效 ;HTTP 错误 401.2 - Unauthorized 由于身份验证头无效,您无权查看此页
因为修改过管理员账号的密码后重启服务器导致IIS无法启动,出现已下异常 1.解决:"启动Windows Process Activation Service时,出现错误13:数据无效&quo ...
- 如何安装并简单的使用OwinHost——Katana
微软OWIN的提出必然会引起一场风暴,而我们作为C#阵营中一份子,自然免不了会卷入其中.OWIN是什么东西,我在这里就不解析了,还不知道是OWIN是什么的读者请打开浏览器,然后搜索即可,中文的英文的应 ...
- WPF - 属性系统 (2 of 4)
属性更改回调 前一章的示例中,对各个参数的设置都非常容易理解.如果我们仅仅需要创建一个独立的依赖项属性,那么上面所提到的创建依赖项属性的基础知识足以满足需求.但是事情往往并非如此完美.在一个系统中,很 ...
- [转载]:STM32为什么必须先配置时钟再配置GPIO
转载来源 :http://blog.csdn.net/fushiqianxun/article/details/7926442 [原创]:我来添两句,就是很多同学(包括我)之前搞低端单片机,到了stm ...
- win10更新系统后wifi连接不上了怎么解决?
遇到了一个小问题,由于更新了一下win10,发现wifi不能用了,以为是wifi密码错了,选择忘记密码试了两次,又试了不同的wifi都不行,发现网卡无线驱动也没事,在网上百度了好久发现说的方法都没用, ...