Zabbix Viele URL per Batchjob prüfen

#!/usr/bin/php
<?php
// Wo kommen die URLs her?
$config['infile'] = 'planet49url.txt';

// Wo wird ein ausführlicher Bericht gespeichert?
$config['outfile'] = '/tmp/url_checker.log';

// Timeout in Sekunden, nachdem ein Check abgebrochen wird.
$config['timeout'] = '5';

// Welchen HTTP status muss die Seite haben
$config['required_http_code'] = 200;

// Kann auch mit --verbose erreicht werden
$config['verbose']            = FALSE;

// Wenn Pattern auf Seite nicht gefunden wurde, wird komplette Seite gespeichert.
$config['dump_failed_pages']  = FALSE;

// Wie lange in Minuten wird zwischen den Checks gewartet
$config['sleep']              = 7;

// IP-Adresse des Zabbix-Servers
$config['zabbix_server'] = '127.0.0.1';

// Das Summary wird an Zabbix geschickt. Items mit Prefix und Summary Key müssen existieren
$config['item_prefix'] = 'url_check';

// Welchem Host im Zabbix sollten die Items zugeordnet werden.
$config['zabbix_host'] = 'Zabbix-Server';

 // Pfad zur Binary
$config['zabbix_sender'] = '/opt/zabbix/bin/zabbix_sender';

// ===================== ENDE Konfiguration ================================= //

$sleep     = $config['sleep']*60;
$loops     = 0;
$max_loops = FALSE;
while(TRUE)
{
    $Check = new check($config);
    $Check->read_file();
    $Check->check_urls();
    $Check->summary();
    if($loops === $max_loops) exit;
    sleep($sleep);
    $loops++;
}

class check
{
    private $config = array();
    private $checks = array();  // Array mit URLs und Strings die geprüft werden
    private $failed_urls  = 0;
    private $checked_urls = 0;
    private $good_urls    = 0;  
    
    public function __construct($config)
    {
        $this->config = $config;
        $this->check_infile();
        $this->read_parameters();
    }
    
    private function read_parameters()
    {
        global $argv;
        if(isset($argv[1]) && $argv['1'] === '--verbose')
        {
            $this->config['verbose'] = TRUE;
        }
    }
    
    private function message($msg,$padding=0,$append_linebreack=TRUE)
    {
        $msg = str_pad($msg,$padding);       
        if($append_linebreack) $msg.="\n";
        if($this->config['verbose']) echo $msg;
        
        // Schreibe logfile
        $log = date('Y-m-d H:i:s').' - '.$msg;
        file_put_contents($this->config['outfile'],$log,FILE_APPEND);
    }
    
    private function check_infile()
    {
        if(! file_exists($this->config['infile']))
        {
            $this->message('Inputfile kann nicht geöffnet werden.');
            die();
        }
    }
    
    // Zerlege die Eingabedatei in die URL und den zu suchenden String
    public function split_row($row)
    {
        $split = explode('|',$row);
        $return['url']     = trim($split[0]);
        if(! preg_match("/http:\/\//",$return['url']))
        {
            $return['url'] = 'http://'.$return['url'];
        }
        if(isset($split[1]))
        {
            $return['pattern'] = trim($split[1]);
        }
        else
        {
            $return['pattern'] = '';
        }
        return $return;
    }
    
    // Lese die Datei in ein array ein
    public function read_file()
    {
        $this->message(date('r').' Datei zum wird zum Checken geöffnet');
        $fh = fopen($this->config['infile'],'r');
        while(($row = fgets($fh, 1024)) !== FALSE)
        {
            $this->checks[] = $this->split_row($row);
        }
        fclose($fh);
        $this->message('Datei enthält '.count($this->checks).' URLS zum checken.');
    }
    
    // Prüfe die URLS
    public function check_urls()
    {
        $this->message(str_pad('',75,'='));
        foreach($this->checks as $check)
        {
            $this->message($check['url'].' '.$check['pattern'],50,FALSE);
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $check['url']);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->config['timeout']);
            $output   = curl_exec($ch);
            $info     = curl_getinfo($ch);
            $time     = round($info['total_time'],3);
            //print_r($info);
            if($check['pattern'] && strstr($output,$check['pattern']) && $info['http_code'] == $this->config['required_http_code'])
            {
                $this->message(' OK     ['.$time.' ms]');
                $this->good_urls++;
                //file_put_contents('good_urls.txt',implode('|',$check)."\n",FILE_APPEND); 
            }
            else
            {
                $this->message(' FAILED ['.$time.' ms] '.$info['http_code']);
                $this->failed_urls++;
                if($this->config['dump_failed_pages'])
                {
                    $dump_file = str_replace('http://','site_http_',$check['url']).'.txt';
                    file_put_contents($dump_file,$output); 
                }
            }
            //echo "$output\n\n";
            $this->checked_urls++;
            curl_close($ch);
        }
    }
    
    public function summary()
    {
        $this->message(str_pad('',75,'='));
        $this->message('Geprüfte URLS    : '.$this->checked_urls);
        $this->message('Fehlerhafte URLS : '.$this->failed_urls);
        $this->message('Gute URLS        : '.$this->good_urls);
        $this->zabbix_sender('failed',$this->failed_urls);
        $this->zabbix_sender('good',$this->good_urls);
        $this->zabbix_sender('checked',$this->checked_urls);
        $this->zabbix_sender('lastcheck',time());
        $this->message(date('r')." Check beendet\n");
    }
    
    private function zabbix_sender($item,$value)
    {
        $cmd = $this->config['zabbix_sender'];
        $cmd.= ' -k '.$this->config['item_prefix'].'.'.$item;
        $cmd.= ' -o '.$value.' -z '.$this->config['zabbix_server'];
        $cmd.= ' -s "'.$this->config['zabbix_host'].'" >/tmp/zabbix_sender.log 2>&1';
        shell_exec($cmd);
        if($this->config['verbose'])  $this->message('# '.$cmd);
    }
}