Login   Register  
PHP Classes
elePHPant
Icontem

File: adv_wdt.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Tomasz Malewski  >  adv_wdt  >  adv_wdt.php  >  Download  
File: adv_wdt.php
Role: Class source
Content type: text/plain
Description: Main class for watchdog
Class: adv_wdt
Track changes of pages in a MySQL database
Author: By
Last change: Fixing one function - cron
Date: 3 years ago
Size: 6,073 bytes
 

Contents

Class file image Download
<?php



// ==============================================================================
// File name   : adv_wdt.php
// Version     : 2011-05-07
// Author      : Tomasz Malewski - varsovie@o2.pl
// License     : BSD without greetings. 
// Briefing    : A Website Watchdog scanning webpage without RSS for update.

class adv_wdt {

    function 
adv_wdt() {
        
$this->margin=0;        // during insert put margin , then during diff checking if length exceed percentage length change is valid
        
$this->mailto='';        // during insert put mailto field in table, then e-mail notificaiton out when diff true
        
$this->diffupdatetrue;    // during diff checking update table with last seend values
        
$this->diffchecksumfalse;    // during diff compare checksum too instead of length only
        
$this->debug=0;
        }    
// adv_wdt init function

/* Function curl    */
/* classic curl feature it returns page content. It's most compatible solution with bypass for CURLOPT_FOLLOWLOCATION and open_basedir restriction issue */
/* For more advanced curl I suggest use snoppy.class */
    
function curl($url){
        
$limit=5;                        // limit page redirection, 5 is usually enough.
        
for ($redirect=0$redirect $limit$redirect++){
            
$ch curl_init($url);
            
curl_setopt($chCURLOPT_RETURNTRANSFER1);
            
curl_setopt($chCURLOPT_HEADERtrue);
//            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);    // too buggy in most php.ini with open_basedir restriction.
//            echo "<hr>".$redirect.$url.$header;            // DEBUG for steps in redirection
                    
$header curl_exec($ch); 
            if (
curl_getinfo($chCURLINFO_HTTP_CODE) == 301 || curl_getinfo($chCURLINFO_HTTP_CODE) == 302){
                
preg_match('/Location:(.*?)\n/'$header$matches);
                
$url trim(array_pop($matches));
                }    
// if 301
                
else {
                
curl_setopt($chCURLOPT_HEADERfalse);
                
curl_setopt($chCURLOPT_URL$url);
                
$header curl_exec($ch); 
                
curl_close($ch); 
                
$this->curl[length]=strlen($header);
                
$this->curl[checksum]=md5($header);
                return (
$header);break;exit;
                }    
// else for 301
//            if ($redirect==$limit) break;    // no needed anymore
            
}    // redirect
            
echo " *** Timeout";
        }    
// curl


    
function sql_connect ($sqlhost$sqluser$sqlpass$sqldb$sqltable,$sqlport=3306 ){
    
$this->con mysql_connect($sqlhost.':'.$sqlport$sqluser$sqlpass);
    
mysql_select_db($sqldb,$this->con);
    
$this->sqldatabase $sqldb;        // needed for SQL delete feature
    
$this->sqltable $sqltable;
    if( !
mysql_num_rowsmysql_query("SHOW TABLES LIKE '".$sqltable."'"))){
        echo 
"ADV_WDT: *** Error: Temporary SQL table doesn't exist, check manual for adv_wdt php class to create one.<br>";return false;
        }    
// if table exists
    
return true;
    } 

    function 
sql_flush () {    // delete everything from table !!! 
        
mysql_query ("DELETE FROM `".$this->sqldatabase."`.`".$this->sqltable."` ") or die(mysql_error());        
        }    
// sqlflush

    
function sql_addURL ($url)    {
        
$html$this->curl ($url);
        
mysql_query ("insert into ".$this->sqltable." (`URL`,`active`,`changed`,checksum,length,margin,create_DT,`mailto`) 
                            values ('"
.$url."','1','0','".md5($html)."','".strlen($html)."','0',NOW(),'".$this->mailto."')") or die(mysql_error());        
        }    
// sql addURL

    
function sql_delURL ($url)    {
        
mysql_query ("DELETE FROM `".$this->sqldatabase."`.`".$this->sqltable."` WHERE `URL` = '".$url."' limit 1") or die(mysql_error());        
        }    
// sqldelURL

    
function sql_diffURL ($url)    {
        
$sqlq1="select * from ".$this->sqltable." where `URL`='".$url."' and active=1 limit 1";
        
$sqlq1b=mysql_query($sqlq1) or die(mysql_error()); 
        while(
$sqlq1c mysql_fetch_assoc($sqlq1b)) {
            
$newhtml $this->curl ($url);
//            $margin = abs ( 100 -  round ( (strlen($newhtml) / $sqlq1c[length])*100,0));    // match percentage difference between old & new HTML length
            
$margin_down $sqlq1c[length] - round $sqlq1c[margin] * $sqlq1c[length]);
            
$margin_top $sqlq1c[length] + round $sqlq1c[margin] * $sqlq1c[length]);
//            if (strlen($newhtml)!=$sqlq1c[length])    {        // replace with new line for much easier compare way :   
            
if ( strlen($newhtml) < $margin_down || strlen($newhtml) > $margin_top || ($this->diffchecksum== true && md5($newhtml)!=$sqlq1c[checksum]) ) {
                if (
$this->debug==true) { echo " *** page has changed $margin len: ".$sqlq1c[length].'->'.strlen($newhtml)."<br>";}        // DEBUG
                // ADD mailto routine -- defualt commented to avoid mail spam during developing
                // if (strlen($sqlq1c[mailto])>4) { mail ($sqlq1c[mailto],"ADV_WDT: Page Changed ","$url")};
                
mysql_query("update ".$this->sqltable." set changed=1,update_DT=NOW() where `URL`='".$url."' limit 1") or die(mysql_error());  // last step update record                 
                
if ($this->diffupdate== true) {
                    
mysql_query("update ".$this->sqltable." set length='".strlen($newhtml)."',checksum='".md5($newhtml)."' where `URL`='".$url."' limit 1") or die(mysql_error());  // last step update record                 
                    
}    // diffupdate
                
return true;
                }    
//    if page changed
                
else 
                {
                
mysql_query("update ".$this->sqltable." set changed=0,update_DT=NOW() where `URL`='".$url."' limit 1") or die(mysql_error());  // last step update record 
                
return false;
                }    
// else if page changed            
            
}        // while sqlq1c
        
}    // sqldiffURL

    
function sql_diffURLcron() {

        
$sqlq2="select URL from ".$this->sqltable." where active=1";
        
$sqlq2b=mysql_query($sqlq2) or die(mysql_error()); 
        while(
$sqlq2c mysql_fetch_assoc($sqlq2b)) {
//            print_r ($sqlq2c);
            
$this->sql_diffURL ($sqlq2c[URL]);
            }        
// sql        
        
}    // diffURL cron

    
function sql_activateURL ($url)
        {
        
mysql_query("update ".$this->sqltable." set active=1,changed=0,update_DT=NOW() where `URL`='".$url."' limit 1") or die(mysql_error());  
        }    
// sqlactivateurl

    
function sql_deactivateURL ($url)
        {
        
mysql_query("update ".$this->sqltable." set active=0,update_DT=NOW() where `URL`='".$url."' limit 1") or die(mysql_error());  
        }    
// sql deactivateurl

    
}    // class adv_wdt

?>