2011-10-20 3 views
0

J'ai un script qui vérifie un site Web ($ host) pour une chaîne de caractères ($ find). Si la chaîne existe, rien ne se passe, si la chaîne n'est pas trouvée, un e-mail est envoyé à une adresse e-mail prédéfinie. Le problème que j'ai est que j'ai besoin d'un tableau d'URL et je crois un deuxième tableau de texte. Le texte du tableau doit correspondre aux URL du tableau. Peut-être stocker les URL et le texte dans un fichier (s) texte pourrait être une meilleure solution.Ajout d'un tableau à un script php

Voici le script tel qu'il est actuellement, travaillant sur le domaine unique.

<?php 
    $host = 'www.my-domain.com'; 
    $find = 'content on my page'; 

    function check($host, $find) { 
     $fp = fsockopen($host, 80, $errno, $errstr, 10); 
     if (!$fp) { 
      echo "$errstr ($errno)\n"; 
     } else { 
      $header = "GET/HTTP/1.1\r\n"; 
      $header .= "Host: $host\r\n"; 
      $header .= "Connection: close\r\n\r\n"; 
      fputs($fp, $header); 
      while (!feof($fp)) { 
       $str.= fgets($fp, 1024); 
      } 
      fclose($fp); 
      return (strpos($str, $find) !== false); 
     } 
    } 


    function alert($host) { 
     mail('[email protected]', 'Monitoring', $host.' down'); 
    } 

    if (!check($host, $find)) alert($host); 

    ?> 

Nouveau code avec tableau en place:

$hostMap = array(
    'www.my-domain.com' => 'content on site', 
    'www.my-domain2.ca' => 'content on second site', 
); 

foreach ($hostMap as $host => $find) 
{ 
     function check($host, $find) 
     { 
       $fp = fsockopen($host, 80, $errno, $errstr, 10); 
       if (!$fp) 
       { 
         echo "$errstr ($errno)\n"; 
       } else { 
         $header = "GET/HTTP/1.1\r\n"; 
         $header .= "Host: $host\r\n"; 
         $header .= "Connection: close\r\n\r\n"; 
         fputs($fp, $header); 
         while (!feof($fp)) { 
           $str.= fgets($fp, 1024); 
         } 
         fclose($fp); 
         return (strpos($str, $find) !== false); 
       } 
     } 

     function alert($host) 
     { 
       mail('[email protected]', 'Website Monitoring', $host.' is down'); 
     } 

     print $host; 
     print $find; 

//if (!check($host, $find)) alert($host); 

     if(!check($host, $find)) 
     { 
       alert($host); 
     } 
} 

?> 

Déplacé les fonctions en dehors du foreach (

ini_set('display_errors', true); 
     $hostMap = array(
     'www.my-domain.com' => 'content on site', 
     'www.my-domain2.ca' => 'content on second site', 
    ); 

      function check($host, $find) 
      { 
        $fp = fsockopen($host, 80, $errno, $errstr, 10); 
        if (!$fp) 
        { 
          echo "$errstr ($errno)\n"; 
        } else { 
          $header = "GET/HTTP/1.1\r\n"; 
          $header .= "Host: $host\r\n"; 
          $header .= "Connection: close\r\n\r\n"; 
          fputs($fp, $header); 
          while (!feof($fp)) { 
            $str.= fgets($fp, 1024); 
          } 
          fclose($fp); 
          return (strpos($str, $find) !== false); 
        } 
      } 

      function alert($host) 
      { 
        mail('[email protected]', 'Website Monitoring', $host.' is down'); 
      } 

      print $host; 
      print $find; 

    //if (!check($host, $find)) alert($host); 
    foreach ($hostMap as $host => $find) 
    { 

      if(!check($host, $find)) 
      { 
        alert($host); 
      } 
    } 

    ?> 

Voici le code final avec un tableau de travail au cas où quelqu'un d'autre veut une solution comme celle-ci:

function check($host, $find) 
    { 
     $fp = fsockopen($host, 80, $errno, $errstr, 10); 
     if (!$fp) 
      { 
          echo "$errstr ($errno)\n"; 
         } else { 
          $header = "GET/HTTP/1.1\r\n"; 
          $header .= "Host: $host\r\n"; 
          $header .= "Connection: close\r\n\r\n"; 
          fputs($fp, $header); 
          while (!feof($fp)) { 
            $str.= fgets($fp, 1024); 
          } 
          fclose($fp); 
          return (strpos($str, $find) !== false); 
         } 
    } 

function alert($host) 
    { 
     $headers = 'From: Set your from address here'; 
     mail('[email protected]', 'Website Monitoring', $host.' is down' $headers); 
    } 

$hostMap = array(
'www.my-domain.com' => 'content on site', 
'www.my-domain2.com' => 'content on second site', 
); 

    //if (!check($host, $find)) alert($host); 
    foreach ($hostMap as $host => $find) 
    { 

      if(!check($host, $find)) 
      { 
        alert($host); 
      } 
    } 
unset($host); 
unset($find); 

?> 
+0

La troisième itération du code a un foreach qui ne semble pas fonctionner dans le tableau. Le premier site du tableau est le seul vérifié. Le seul message que je reçois est "Undefined variable: str in /srv/www/php/php_testing/monitor.php on line 25". Je ne sais pas où est mon erreur. – Havock

Répondre

2
$hostMap = array(
    'www.my-domain.com' => 'content on my page', 
    /* etc. */ 
); 

foreach($hostMap as $host => $find) 
{ 
    if(!check($host, $find)) 
    { 
     alert($host); 
    } 
} 

Cependant, sachez que - selon la quantité de domaines que vous archivez - séquentielle de diffusion de grandes quantités de mails avec mail() natif de PHP n'est pas très efficace. Vous pouvez regarder dans des bibliothèques de messagerie plus spécialisées pour cela, comme SwiftMailer. D'un autre côté, vu que vous envoyez une seule et même adresse e-mail, vous pouvez également simplement enregistrer les domaines défaillants dans un tableau et les envoyer tous dans un e-mail une fois que vous avez terminé vérification bien sûr.

+0

J'ai essayé de faire fonctionner ceci mais ce que j'ai trouvé ne semble pas aller au-delà du 1er site dans le tableau. J'ai ajouté le nouveau code à la question ci-dessus. – Havock

+0

@ user973661: Vous devez définir les fonctions en dehors de la boucle 'foreach' une fois (pas sur chaque itération de la boucle' foreach'). En réalité; il n'est même pas permis de redéfinir les fonctions. Cela provoquera une erreur fatale. Je présume que vous n'affichez pas d'erreurs à l'écran (en mettant 'ini_set ('display_errors', true)' au début de votre script), sinon vous devez avoir été averti de cette erreur. Assurez-vous que vous utilisez uniquement l'affichage des erreurs sur la machine de développement, pas sur une machine de production. –

+0

J'ai ajouté display_errors et déplacé les fonctions en dehors de foreach (j'ai ajouté le code ci-dessus). Je reçois une variable indéfinie et je n'ai toujours qu'un seul site vérifié. – Havock

1

Vous pouvez simplement stocker tout dans un tableau multidimensionnel et mettre un itérateur autour de toute la section de travail du code.

$list_of_sites[0]["url"] = blah; 
$list_of_sites[0]["text"] = blah; 
$list_of_sites[1]["url"] = blah; 
$list_of_sites[1]["text"] = blah; 

foreach($list_of_sites as $site){ 
    $url = $site["url"]; 
    $text = $site["text"]; 

    check($url, $text); 
} 
Questions connexes