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* ...
随机推荐
- PayPal高级工程总监:读完这100篇论文 就能成大数据高手(附论文下载)
100 open source Big Data architecture papers for data professionals. 读完这100篇论文 就能成大数据高手 作者 白宁超 2016年 ...
- dotNet Core开发环境搭建及简要说明
一.安装 .NET Core SDK 在 Windows 上使用 .NET Core 的最佳途径:使用Visual Studio. 免费下载地址: Visual Studio Community 20 ...
- MVC还是MVVM?或许VMVC更适合WinForm客户端
最近开始重构一个稍嫌古老的C/S项目,原先采用的技术栈是『WinForm』+『WCF』+『EF』.相对于现在铺天盖地的B/S架构来说,看上去似乎和Win95一样古老,很多新入行的,可能就没有见过经典的 ...
- git提交项目到已存在的远程分支
今天想提交项目到github的远程分支上,那个远程分支是之前就创建好的,而我的本地关联分支还没创建. 之前从未用github提交到远程分支过,弄了半个钟,看了几篇博文,终于折腾出来.现在把步骤整理 ...
- liunx 磁盘管理命令记录
Linux磁盘管理好坏管理直接关系到整个系统的性能问题. Linux磁盘管理常用三个命令为df.du和fdisk. df:列出文件系统的整体磁盘使用量 du:检查磁盘空间使用量 fdisk:用于磁盘分 ...
- 【腾讯Bugly干货分享】Android Patch 方案与持续交付
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57a31921ac3a1fb613dd40f3 Android 不仅系统版本众多 ...
- EasyPR--开发详解(8)文字定位
今天我们来介绍车牌定位中的一种新方法--文字定位方法(MSER),包括其主要设计思想与实现.接着我们会介绍一下EasyPR v1.5-beta版本中带来的几项改动. 一. 文字定位法 在EasyPR前 ...
- Nginx服务器之Nginx与tomcat结合访问jsp
本文使用linux centos系统 本文概述: JSP是一种动态网页技术标准.使用的方式是在HTML文件中插入程序段和JSP标记,而形成JSP文件.使用JSP开发WEB应用可以跨平台开发.但jsp需 ...
- Nginx 服务器 之Nginx与tomcat实现负载均衡
本文讲解我们如何使用Nginx做反向带服务器,实现nginx与tomcat服务器集群做负载均衡. 一.nginx与tomcat实现负载均衡 1.在/usr/local/ngnix/conf 创建 ...
- TODO List - 任务表
TODO List - 任务表 Angular1 --> Ionic1 --> Vue --> Weex Python --> Django --> Tornado -- ...