2011-10-20 13 views
0

ウェブサイト($ホスト)に文字列($ find)をチェックするスクリプトがあります。文字列が存在する場合は何も起こりません。文字列が見つからない場合は、電子メールがあらかじめ設定された電子メールアドレスに送信されます。PHPスクリプトに配列を追加する

問題は、私はURLの配列を持つ必要があり、私はテキストの2番目の配列を信じています。配列内のテキストは、配列内のURLに一致する必要があります。

おそらくURLファイルとテキストファイルをテキストファイルに保存する方が良い方法でしょう。

これは今のところスクリプトで、単一のドメインで作業しています。

<?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); 

    ?> 

代わりに配列した新しいコード:

$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); 
     } 
} 

?> 

はここ(の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); 
      } 
    } 

    ?> 

を機能を移転誰が望んでいる場合、作業配列を持つ最終的なコードですこのような解決策。

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

コードの3番目の反復では、配列を実行していないforeachがあります。配列内の最初のサイトのみがチェックされます。私が得る唯一のメッセージは、 "Undefined variable:str in /srv/www/php/php_testing/monitor.php on line 25"です。 私の間違いはどこにあるのか分かりません。 – Havock

答えて

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

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

しかし、あることに注意してください - ドメインの量に応じて、あなたがチェックしている - 順次PHPのネイティブmail()は非常に効率的ではないとのメールを大量に郵送。 SwiftMailerのような、もっと特殊化されたメールライブラリを探したいかもしれません。

一方、同じメールアドレスを郵送しているのを見ると、失敗したドメインをアレイに保存して、完了後にそれらを1つの電子メールで郵送することもできますもちろんチェック。

+0

私はこれを動作させようとしてきましたが、私が思いついたことは、配列の1番目のサイトを越えて進んでいないようです。上記の質問に新しいコードを追加しました。 – Havock

+0

@ user973661: 'foreach'ループの外で関数を定義する必要があります(' foreach'ループのすべての繰り返しではありません)。実際のところ;関数を再定義することさえできません。これにより、致命的なエラーが発生します。スクリプトの先頭に 'ini_set( 'display_errors'、true)を入れて、画面にエラーを表示していないものと仮定します。そうでなければ、このエラーが通知されている必要があります。プロダクションマシンではなく、開発マシンでのみエラーを表示するようにしてください。 –

+0

私はdisplay_errorsを追加し、foreachの外に関数を移動しました(上記のコードを追加しました)。私は未定義の変数を取得しており、私はまだ1つのサイトをチェックするだけです。 – Havock

1

すべてを多次元配列に格納し、コードの作業セクション全体にイテレータを置くことができます。

$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); 
}