我有这个链接检查脚本,我希望它在链接不起作用时给我一封邮件。 我需要它记住,它向我发送了一个关于链接的电子邮件,所以我没有收到关于同一链接的多封电子邮件。
如果有人帮我解决这个问题,我会建议,因为这对我来说太难了。
<?
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.";
}
}
?>
答案 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;
}
}