喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

【村长请吃饭啊】 ---北京诚聘--- 【你还在犹豫吗?】

上一主题 下一主题
 13  1/2  1  2  > 
     
标题: [原创] 网页快照类  
 
millken
高级会员
Rank: 4



UID 73040
精华 0
积分 692
帖子 422
金钱 692 喜悦币
威望 0
人脉 0
阅读权限 50
注册 2006-5-9
来自 REFERER
状态 离线
网页快照类



<?PHP
//====================================================
//        FileName:    snap.class.php
//        Summary:    网页快照类
//        Author:        millken(迷路林肯)
//        LastModifed:2007-06-29
//        copyright (c)2007 [email]millken@gmail.com[/email]
//====================================================
class snap{
    var 
$dir;
    var 
$log;
    var 
$contents;
    var 
$filename;
    var 
$host;
    var 
$name;
    var 
$data_ts;
    var 
$ttl;
    var 
$url;
    var 
$ts;
    function 
snap(){
        
$this->log "New snap() object instantiated.<br />n";    
        
$this->dir dirname(__FILE__)."/";
    }
    function 
fetch($url="",$ttl=10){
        
$this->log .= "--------------------------------<br />fetch() called<br />n";
        
$this->log .= "url: ".$url."<br />n";
        
$hosts parse_url($url);
        
$this->host $hosts['scheme'].'://'.$hosts['host'].'/';
        if (!
$url) {
            
$this->log .= "OOPS: You need to pass a URL!<br />";
            return 
false;
        }
        
$this->ttl $ttl;
        
$this->url $url;
        
$this->name md5($this->url);
        
$this->filename $this->dir.$this->name;
        
$this->log .= "Filename: ".$this->filename."<br />";
        
$this->getFile_ts();
        
$this->file_get_content();

    }
    function 
file_get_content(){
        
ob_start();
        
$this->ts time() - $this->data_ts;
        if(
$this->data_ts <>&& $this->ts <= $this->ttl){
            
$this->log .= "cache has expired<br />";
            @
readfile($this->filename);    
            
$this->contents ob_get_contents();
            
ob_end_clean();
        }else{
            
$this->log .= "cache hasn't expired<br />";        
            @
readfile($this->url);    
            
$this->contents ob_get_contents();
            
ob_end_clean();
            
$this->saveToCache();
        }
        return 
true;
    }
    function 
saveToCache(){
        
$this->log .= "saveToCache() called<br />";
        
//create file pointer
        
if (!$fp=@fopen($this->filename,"w")) {
            
$this->log .= "Could not open ".$this->filename."<br />";
            return 
false;
        }
        
$this->contents $this->formaturl($this->contents,$this->host);
        
$this->contents preg_replace("'<script[^>]*?>.*?</script>'si","",$this->contents);
        
//write to file 
        
if (!@fwrite($fp,$this->contents)) {
            
$this->log .= "Could not write to ".$this->filename."<br />";
            
fclose($fp);
            return 
false;
        }
        
//close file pointer
        
fclose($fp);
        return 
true;
    }
    function 
getFile_ts(){
        
$this->log .= "getFile_ts() called<br />";
        if (!
file_exists($this->filename)) {
            
$this->data_ts 0;
            
$this->log .= $this->filename." does not exist<br />";
            return 
false;
        }
        
$this->data_ts filemtime($this->filename);
        return 
true;
    }
    function 
formaturl($l1,$l2){
    if (
preg_match_all("/(<img[^>]+src=\"([^\"]+)\"[^>]*>)|(<link[^>]+href=\"([^\"]+)\"[^>]*>)|(<a[^>]+href=\"([^\"]+)\"[^>]*>)|(<img[^>]+src='([^']+)'[^>]*>)|(<a[^>]+href='([^']+)'[^>]*>)/i",$l1,$regs)){
      foreach(
$regs[0] as $num => $url){
       
$l1 str_replace($url,$this->lIIIIl($url,$l2),$l1);
      }
    }
    return     
$l1;
    }

    function 
lIIIIl($l1,$l2){
    if(
preg_match("/(.*)(href|src)=(.+?)( |/>|>).*/i",$l1,$regs)){$I2 $regs[3];}
    if(
strlen($I2)>0){
      
$I1 str_replace(chr(34),"",$I2);
      
$I1 str_replace(chr(39),"",$I1);
    }else{return 
$l1;}
    
$url_parsed parse_url($l2);
    
$scheme      $url_parsed["scheme"];if($scheme!=""){$scheme $scheme."://";}
    
$host      $url_parsed["host"];    
    
$l3       $scheme.$host;
    if(
strlen($l3)==0){return $l1;}
    
$path      dirname($url_parsed["path"]);if($path[0]=="\"){$path="";}
    $pos      = strpos($I1,"
#");
    
if($pos>0$I1 substr($I1,0,$pos);
    
//判断类型
    
if(preg_match("/^(http|https|ftp):(//|\\)(([w/\+-~`@:%])+.)+([w/\.=?+-~`@':!%#]|(&)|&)+/i",$I1)){return $l1; }//http开头的url类型要跳过
    
elseif($I1[0]=="/"){$I1 $l3.$I1;}//绝对路径
    
elseif(substr($I1,0,3)=="../"){//相对路径
          
while(substr($I1,0,3)=="../"){
       
$I1 substr($I1,strlen($I1)-(strlen($I1)-3),strlen($I1)-3);
       if(
strlen($path)>0){
        
$path dirname($path);
       }
      }
      
$I1 $l3.$path."/".$I1;
    }
    elseif(
substr($I1,0,2)=="./"){
      
$I1 $l3.$path.substr($I1,strlen($I1)-(strlen($I1)-1),strlen($I1)-1);
    }
    elseif(
strtolower(substr($I1,0,7))=="mailto:"||strtolower(substr($I1,0,11))=="javascript:"){
      return 
$l1;
    }else{
      
$I1 $l3.$path."/".$I1;
    }
    return 
str_replace($I2,"\"$I1\"",$l1);
    }
}
?>
用法test.php:

<?php
require_once(dirname(__FILE__).'/snap.class.php');
$h = new snap();
$h->fetch($_GET['url']);
//echo $h->log;
echo $h->contents;
?>
$ttl为更新快照文件的周期,其中的URL补全函数用到了村里某个兄弟的原创,

对于不好的地方,希望大家将此类完善下去。




硬盘挂了,东东丢了.
2007-6-29 10:24 AM#1
查看资料  访问主页  Blog  发短消息  顶部
 
looking_for1
注册会员
Rank: 2


UID 78393
精华 0
积分 112
帖子 304
金钱 112 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-8-15
来自 hubei
状态 离线
[推荐阅读] 有人知道这种用法吗:$text_user = _("用户名:");
网页快照
有百度的N吗
百度的不错




爱我的人们,我一定会爱你们
2007-6-29 10:29 AM#2
查看资料  访问主页  Blog  发短消息  QQ  Yahoo!  顶部
 
uuq
高级会员
Rank: 4
中级会员


UID 28149
精华 1
积分 821
帖子 859
金钱 811 喜悦币
威望 10
人脉 0
阅读权限 50
注册 2004-4-27
来自 广州
状态 离线
[推荐阅读] 用类如何调用FCK编辑器
好像不错耶
2007-7-2 05:03 PM#3
查看资料  发短消息  顶部
 
millken
高级会员
Rank: 4



UID 73040
精华 0
积分 692
帖子 422
金钱 692 喜悦币
威望 0
人脉 0
阅读权限 50
注册 2006-5-9
来自 REFERER
状态 离线
[推荐阅读] 儿子与Linux
我看了下GOOGLE和BAIDU的都是只缓存文字,图片和CSS等也是调用远程的,不过它们没有改变源代码本身,但照样能调用远程的CSS和图片,这可能和服务器上设置有关吧。
还有虽然能在某个周期内更新缓存,也没有考虑如果URL失效时怎么办?




硬盘挂了,东东丢了.
2007-7-3 03:41 PM#4
查看资料  访问主页  Blog  发短消息  顶部
 
qh663
版主
Rank: 7Rank: 7Rank: 7
中级会员


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
[推荐阅读] PHP+Ajax取值的一个问题!
其实这个类也是远程调用css与图片之类的。百度的好象用到 iframe之类的。



五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
2007-7-6 01:29 AM#5
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
迎风
高级会员
Rank: 4
一二三四五,上山打老鼠


UID 66573
精华 0
积分 803
帖子 870
金钱 803 喜悦币
威望 0
人脉 0
阅读权限 50
注册 2005-9-11
状态 离线
[推荐阅读] 经历(这样的公司和经理)
baseurl,不过这个在IE7下会有解析问题



Azazazazazazazazazazazazazazazazazazazazazaz
2007-7-6 06:40 AM#6
查看资料  发短消息  顶部
 
idgnarn
新手上路
Rank: 1


UID 88636
精华 0
积分 31
帖子 28
金钱 31 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2007-2-28
状态 离线
[推荐阅读] 关于 PHP MYSQL LIKE 搜索 特殊字符的过滤
$path      = dirname($url_parsed["path"]);if($path[0]=="\"){$path="";}
应该是$path[0]=="\\" 吧
2007-7-8 09:35 AM#7
查看资料  发短消息  顶部
 
looking_for1
注册会员
Rank: 2


UID 78393
精华 0
积分 112
帖子 304
金钱 112 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-8-15
来自 hubei
状态 离线
[推荐阅读] 还是那个正则


QUOTE:
$this->log .= "--------------------------------<br />fetch() called<br />n";
现在终于看到了,论坛果然吃反斜杠。




爱我的人们,我一定会爱你们
2007-7-9 03:45 PM#8
查看资料  访问主页  Blog  发短消息  QQ  Yahoo!  顶部
 
剑枫 (雪花)
论坛元老
Rank: 8Rank: 8
欧玛嘎


UID 26144
精华 1
积分 4921
帖子 1684
金钱 4911 喜悦币
威望 10
人脉 0
阅读权限 90
注册 2004-2-14
来自 山东郓城
状态 离线
[推荐阅读] 要对用户提交的数据进行哪些过滤呢?
base href='远程地址'



在场外支持奥运.....
2007-7-13 10:46 PM#9
查看资料  访问主页  发短消息  QQ  顶部
 
麻辣龙虾
注册会员
Rank: 2



UID 91106
精华 0
积分 111
帖子 85
金钱 111 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2007-4-11
状态 离线
[推荐阅读] 做个多个小型网站想从事从大型网站开发
Warning: preg_match() [function.preg-match]: Unknown modifier '>'

if(preg_match("/(.*)(href|src)=(.+?)( |/>|>).*/i",$l1,$regs)){$I2 = $regs[3];}
什么问题?




晨光湖畔
2007-10-4 09:42 AM#10
查看资料  Blog  发短消息  顶部
 13  1/2  1  2  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 


Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.038543 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP