链接检查器 - 邮件无效链接

时间:2009-07-04 15:26:44

标签: php hyperlink

我有这个链接检查脚本,我希望它在链接不起作用时给我一封邮件。 我需要它记住,它向我发送了一个关于链接的电子邮件,所以我没有收到关于同一链接的多封电子邮件。

如果有人帮我解决这个问题,我会建议,因为这对我来说太难了。

<?
function checklink($links) {
    $working = 0;
    $link = $links;
    $links = preg_replace('/\s+/', '', $links);

    if(strstr($links,"rapidshare.com")){
        $var = file_get_contents($links);
        if(strpos($var,"You want to download the file ")) {
        $working = 1;
        }
    }
    elseif (strstr($links,"megaupload.com")) {
        $var1 = file_get_contents($links);
        if(strpos($var1,"Please enter")) {
        $working = 1;
        }
    }
    elseif (strstr($links,"megashares.com")) {
            $var2 = file_get_contents($links);
            if(strpos($var2,"Filename:")) {
            $working = 1;
            }
    }
    elseif (strstr($links,"sendspace.com")) {
        $var3 = file_get_contents($links);
        if(strpos($var3,"404 Page Not Found")) {
            $working = 0;
        }
        elseif(strpos($var3,"Sorry, the file you requested is not available.")){
            $working = 0;
        }
        else {
            $working = 1;
        }
        }
    elseif(strstr($links,"rapidshare.de")) {
        $var5 = file_get_contents($links);
        if(strpos($var,"You want to download the file ")){
            $working = 1;
        }
    }
    elseif (strstr($links,"mediafire.com")) {
        $var4 = file_get_contents($links);
        if(strpos($var4,"Sharing")) {
        $working = 1;
        }
    }

    if ($working == 1) {
        echo "<a href=\"". $link . "\" target=\"_blank\">". $link . "</a>";
    }
    else {
        echo "The link is not working. Please let me know about it and I'll fix it.";
    }
}
?>

3 个答案:

答案 0 :(得分:1)

我认为最好的方法是收集链接并将它们存储在数据库表中。

然后有一个系统通过链接和检查,如果它工作,它将其标记为工作链接,如果没有,那么它将其标记为断开的链接,并向您发送电子邮件。

然后你必须检查链接是否在数据库中(因为你不能使用mysql的varchar作为唯一的,因为它的最大值为255,链接可以更长)

如果它在数据库中,则检查扫描结果是什么。

BTW你使用file_get_contents的方式是一个缓慢的过程。因为它下载整个页面。我建议使用cURL.

答案 1 :(得分:1)

我同意Olafur,但是如果您无法访问数据库,则可以使用服务器的文件系统将URL的统计信息保存在组合的配置/日志文件中,如逗号分隔文件。假设你有一个这样的文件:

rapidshare.com,You want to download the file,0,0
megaupload.com,Please enter,0,0
megashares.com,Filename:,0,0

这四个字段是'URL','要检查的文本','最后检查结果'和'已发送邮件'。代码可能是这样的:

$file = "myfile.txt";

// open the file
$fh = fopen($filename, "r");

// read the full file contents into a string
$contents = fread($fh, filesize($file));

// close the file
fclose($fh);

// split the string into an array of lines
$lines = split("\n", $contents);

// split each line into its fields for processing
$i = 0;
foreach ($lines as $line) {
   $checkarray[$i] = split(",", $line);
   $i++;
}

现在,您可以循环访问数组并执行任何操作,并在回溯过程中写回包括“mail sent”状态字段的信息。使用$ fields [0]作为URL,$ fields [1]作为要检查的文本,并且您可以使用$ fields [2]读取最后一个状态和使用$ fields [3]的'mail sent'状态。 / p>

foreach($checkarray as $fields) {
   // insert code to do your checks here
   ...

   // write back the results
   $fh = fopen($filename, "w");
   fwrite($fh, $fields[0] . "," . $fields[1] . "," . $working . "," . $mailsent . "\n";
   fclose($fh);

}

希望这可以帮助你。

答案 2 :(得分:0)

这是你想要的代码:

function StatusCheck($url)
{
$urlparts=parse_url($url);
$curl=new CCurl($url);
$headers=$curl->execute();
$headers=$curl->close();
$headers=$curl->getHeader();
$headers=split("\r\n",$headers);
$status=$headers[0];
print_r($headers);
if (strpos($status,"HTTP/1.1 200 OK")===FALSE)
   {
   echo date("d.m.Y H:i:s").$url,': bad'."\n";
   return 0;
   }
else
   {
   echo date("d.m.Y H:i:s").$url,': good'."\n";
   return 1;
   }
}

它检查提供的URL(链接)并打印出标题+信息,如果URL错误(不工作)或良好(状态200 OK)

PS:设置curl选项以遵循重定向

编辑:这是CCurl课程,对不起忘记了:

class CCurl {
   var $m_handle;
   var $m_header;
   var $m_body;

   function CCurl($sUrl) {
       $this->m_handle = curl_init();
       curl_setopt($this->m_handle, CURLOPT_URL, $sUrl);
       curl_setopt($this->m_handle, CURLOPT_HEADER, 1);
       curl_setopt($this->m_handle, CURLOPT_RETURNTRANSFER, 1);
       curl_setopt($this->m_handle, CURLOPT_FOLLOWLOCATION, 1);
       curl_setopt($this->m_handle, CURLOPT_USERAGENT, "StatusCheckBot 0.1");
       return;
   }

   function getHeader() {
       return $this->m_header;
   }

   function execute() {
       $sResponse = curl_exec($this->m_handle);
       $this->m_body = substr($sResponse, strpos($sResponse, "\r\n\r\n") + 4);
       $this->m_header = substr($sResponse, 0, -strlen($this->m_body));
       return $this->m_body;
   }

   function close() {
       curl_close($this->m_handle);
       return;
   }
}