php中实现的一个curl批处理的实例

curl是利用URL语法在命令行方式下工作的开源文件传输工具

本文在php中实现了的一个curl批处理的实例。

代码如下:

  1 header("Content-Type:text/html;charset=utf8");
  2
  3 /* 先获取两个页面的所有a标签 */
  4 // 初始化两个简单处理句柄
  5 $ch1 = curl_init();
  6 $ch2 = curl_init();
  7 curl_setopt_array($ch1,array(
  8     CURLOPT_URL => ‘http://www.sina.com.cn‘,
  9     CURLOPT_HEADER => 0,
 10     CURLOPT_RETURNTRANSFER => 1,
 11 ));
 12 curl_setopt_array($ch2,array(
 13     CURLOPT_URL => ‘http://www.baidu.com/‘,
 14     CURLOPT_HEADER => 0,
 15     CURLOPT_RETURNTRANSFER => 1,
 16 ));
 17
 18 // 初始化批处理句柄,并添加简单处理句柄
 19 $mh = curl_multi_init();
 20 curl_multi_add_handle($mh,$ch1);
 21 curl_multi_add_handle($mh,$ch2);
 22
 23 // 初始化执行状态
 24 $state = null;
 25
 26 // 执行批处理
 27 do{
 28     $mc = curl_multi_exec($mh,$state);
 29 }while($mc == CURLM_CALL_MULTI_PERFORM);
 30 while($mc == CURLM_OK && $state) {
 31     while (curl_multi_exec($mh, $state) === CURLM_CALL_MULTI_PERFORM);
 32     // 经过实验,发现curl_multi_select($mh)总是返回-1,意味着一下代码不会执行
 33     if(curl_multi_select($mh) != -1) {
 34         do{
 35             $mc = curl_multi_exec($mh,$state);
 36         }while($mc == CURLM_CALL_MULTI_PERFORM);
 37     }
 38 }
 39
 40 // 获取内容
 41 $text  = curl_multi_getcontent($ch1);
 42 $text .= curl_multi_getcontent($ch2);
 43
 44 // 找到页面中所有的a标签,保存到$matches
 45 $matches = null;
 46 preg_match_all("/<a.*?href\s*?=\s*?[\‘\"](.*?)[\‘\"].*?>(.*?)<\/a>/",$text,$matches);
 47
 48 // 关闭各个句柄
 49 curl_multi_remove_handle($mh,$ch1);
 50 curl_multi_remove_handle($mh,$ch2);
 51 curl_multi_close($mh);
 52
 53 /*在找到的连接中继续查找title标签 */
 54
 55 $handle = array(); // 存储简单处理句柄的数组
 56 $mhandle = curl_multi_init(); //批处理句柄
 57 // 处理100个页面
 58 foreach(array_slice($matches[1],0,100) as $href) {
 59     $tmp_h = curl_init();
 60     curl_setopt_array($tmp_h,array(
 61         CURLOPT_URL => $href,
 62         CURLOPT_HEADER => 0,
 63         CURLOPT_RETURNTRANSFER => 1,
 64     ));
 65     curl_multi_add_handle($mhandle,$tmp_h);
 66     $handle[] = $tmp_h;
 67 }
 68 do{
 69     $mrc = curl_multi_exec($mhandle,$active);
 70 }while($mrc == CURLM_CALL_MULTI_PERFORM);
 71 while($mrc == CURLM_OK && $active) {
 72     while(curl_multi_exec($mhandle,$active) == CURLM_CALL_MULTI_PERFORM);
 73     if(curl_multi_select($mhandle) != -1) {
 74         do{
 75             $mrc = curl_multi_exec($mhandle,$active);
 76         }while($mrc == CURLM_CALL_MULTI_PERFORM);
 77     }
 78 }
 79
 80 // 获取这些页面的内容
 81 $mtext = null;
 82 foreach($handle as $tmp_h) {
 83     $mtext .= curl_multi_getcontent($tmp_h);
 84     curl_multi_remove_handle($mhandle, $tmp_h);
 85 }
 86 $mmatches = array();
 87 preg_match_all("/<title>(.*?)<\/title>/",$mtext, $mmatches);
 88
 89 // 编码转换
 90 mb_detect_order(‘GB2312,GBK,BIG5,GB18030,UNICODE ,CP936‘);
 91 foreach($mmatches[1] as $key => $val) {
 92     $encoding = mb_detect_encoding($val);
 93     if($encoding != ‘UTF-8‘ && $encoding != ‘CP936‘ && $encoding != ‘GB18030‘ && $encoding !=‘‘) {
 94         $mmatches[1][$key] = iconv($encoding,‘UTF-8//IGNORE‘,$val);
 95     }
 96 }
 97
 98 // 打印title信息
 99 var_dump($mmatches[1]);
100
101 // 关闭批处理句柄
102 curl_multi_close($mhandle);
时间: 2024-10-13 09:54:18

php中实现的一个curl批处理的实例的相关文章

Java中使用多线程、curl及代理IP模拟post提交和get访问

Java中使用多线程.curl及代理IP模拟post提交和get访问 菜鸟,多线程好玩就写着玩,大神可以路过指教,小弟在这受教,谢谢! [java] view plaincopyprint? /** * @组件名:javaDemo * @包名:javaDemo * @文件名:Jenny.java * @创建时间: 2014年8月1日 下午5:53:48 * @版权信息:Copyright ? 2014 eelly Co.Ltd,小姨子版权所有. */ package javaDemo; impo

Java中使用多线程、curl及代理IP模拟post提交和get訪问

Java中使用多线程.curl及代理IP模拟post提交和get訪问 菜鸟,多线程好玩就写着玩.大神能够路过不吝赐教.小弟在这受教.谢谢! 很多其它分享请关注微信公众号:lvxing1788 ~~~~~~ 切割线扭起来 ~~~~~~ /** * @组件名:javaDemo * @包名:javaDemo * @文件名称:Jenny.java * @创建时间: 2014年8月1日 下午5:53:48 * @版权信息:Copyright ? 2014 eelly Co.Ltd,小姨子版权全部. */

Sql Server 因为触发器问题导致数据库更新报错“在触发器执行过程中引发了错误,批处理已中止”的问题处理

在维护一个非常旧的项目时,由于该项目版本已经非常老了,而且在客户现场运行的非常稳定,更要命的是本人目前没有找到该项目的代码,为了处理一个新的需求而且还不能修改程序代码,于是决定从数据库入手,毕竟该项目数据库的脚本还是可以操作的,那就在数据流的必经之路上拦截数据处理业务就是了,于是决定在一张业务表上加一个触发器,关于触发器的基础这里就不多说了,网上一搜一大堆,其实就是一张表的数据行被操作以后会针对被操作的数据行执行一段存储过程脚本,只不过这个存储过程比较特殊罢了,是专门侦听对表的操作然后由系统调用

oracle中如何判断一个字符串是否含有汉字

oracle中如何判断一个字符串是否含有汉字 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ①全角字符的判断,或者是含有汉字的字符串的判断 本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力. 一.2.2 实验环境介绍 11.2.0.3  RHEL6.5 一.2.3 本文简介 看到网友问,怎么查询表中某个字段数据是不是包含了

Java中如何判断一个double类型的数据为0?

Java中如何判断一个double类型的数据为0 其实这个问题很简单,只是很多时候考虑复杂了,直接用==判断即可.下面给出测试例子: /**  * 如何判断一个double类型的数据为0  *  * @author leizhimin 2014/8/27 10:31  */ public class Test4 {     public static void main(String[] args) {         double x = 0.00000000000000000;       

array_rand() 从数组中随机取出一个或多个单元

array_rand() - 从数组中随机取出一个或多个单元 mixed array_rand ( array $input [, int $num_req = 1 ] ) 从数组中取出一个或多个随机的单元,并返回随机条目的一个或多个键. 参数 input: 输入的数组.必需.规定数组. num_req: 指明了你想取出多少个单元.可选.规定返回多少随机键名.如果指定的数目超过了数组里的数量将会产生一个 E_WARNING 级别的错误. 例子 1 从数组返回一个随机键: <?php $a=arr

近期写js库中遇到的一个判别的问题

最近在写一个自己的js库,正写到数组包,在里面定义了一个排序,只对纯数字数据进行排序的方法,但是在测试的时候发现一个很诡异的问题,那就是传入一个对象的时候,它没有返回erroemsg而是返回了对象,上代码: 1 array.sort=function(a){//only for num 2 try{ 3 4 if(!a.some(function(x){return(typeof("string"))})){ 5 var max=a.length-1; 6 7 for(var j=0;

Kooboo中怎么新增一个关联的Details 动态页面。

Kooboo中怎么新增一个关联的Details 动态页面. 有几个要点: 1. Sub Page的Parent Page 必须是英文书写.如果是中文会出现找不到页面 500错误 2. 要在Page Mapping中设置 url和page的关联 3. page要改成dynamices的. Dynamic pages I A dynamic web page is a kind of web page that has been prepared with fresh information (co

linux中如何清空一个文件的内容

方法1: echo "" > /www.jbxue.com /xxx.log 方法2: echo "" >> /www.jbxue.com /xxx.log 方法3: 此命令能与“echo > /var/log/big.log”达到相同效果,不过,命令执行后,需要用“Ctrl + d”结束 方法4: clear > /opt/log/big.log 此命令会把big.log文件内容清空,而不删除文件 方法5: 同样的效果,用true.f