将数组添加到php脚本

时间:2011-10-20 19:30:40

标签: php email

我有一个脚本检查网站($ 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.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('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.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('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.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('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.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('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);

?>

2 个答案:

答案 0 :(得分: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 :(得分: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);
}