Добавление массива в php-скрипт

#php #email

#php #Адрес электронной почты

Вопрос:

У меня есть скрипт, который проверяет веб-сайт ($host) на наличие строки символов ($find). Если строка существует, ничего не происходит, если строка не найдена, тогда электронное письмо отправляется на заранее установленный адрес электронной почты.

Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно иметь массив URL-адресов, и я полагаю, что второй массив текста. Текст в массиве должен совпадать с 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.1rn";
           $header .= "Host: $hostrn";
           $header .= "Connection: closernrn";
           fputs($fp, $header);
           while (!feof($fp)) {
               $str.= fgets($fp, 1024);
           }
           fclose($fp);
           return (strpos($str, $find) !== false);
        }
    }


    function alert($host) {
        mail('mail@my-domain.com', '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.1rn";
                        $header .= "Host: $hostrn";
                        $header .= "Connection: closernrn";
                        fputs($fp, $header);
                        while (!feof($fp)) {
                                $str.= fgets($fp, 1024);
                        }
                        fclose($fp);
                        return (strpos($str, $find) !== false);
                }
        }

        function alert($host)
        {
                mail('my-email@my-domain.com', '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.1rn";
                            $header .= "Host: $hostrn";
                            $header .= "Connection: closernrn";
                            fputs($fp, $header);
                            while (!feof($fp)) {
                                    $str.= fgets($fp, 1024);
                            }
                            fclose($fp);
                            return (strpos($str, $find) !== false);
                    }
            }

            function alert($host)
            {
                    mail('my-email@my-domain.com', '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.1rn";
                            $header .= "Host: $hostrn";
                            $header .= "Connection: closernrn";
                            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('my-email@my-domain.com', '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);

?>
 

Комментарии:

1. На 3-й итерации кода есть foreach, который, похоже, не проходит через массив. Проверяется только первый сайт в массиве. Единственное сообщение, которое я получаю, это «Неопределенная переменная: str в /srv/www/php/php_testing/monitor.php в строке 25». Я не уверен, в чем моя ошибка.

Ответ №1:

 $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. Я пытался заставить это работать, но то, что я придумал, похоже, не выходит за рамки 1-го сайта в массиве. Я добавил новый код к вопросу выше.

2. @user973661: вы должны определять функции вне foreach цикла один раз (не на каждой итерации foreach цикла). На самом деле; даже не разрешено переопределять функции. Это приведет к фатальной ошибке. Я предполагаю, что вы не отображаете ошибки на экране (помещая ini_set( 'display_errors', true ) в начало вашего скрипта), в противном случае вы должны были быть уведомлены об этой ошибке. Убедитесь, что вы используете отображение ошибок только на компьютере разработки, а не на рабочей машине.

3. Я добавил display_errors и переместил функции за пределы foreach (я добавил код выше). Я получаю неопределенную переменную, и я все еще проверяю только один сайт.

Ответ №2:

Вы можете просто сохранить все в многомерном массиве и поместить итератор вокруг всей рабочей части кода.

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