从MySQL表中自动检查URL

时间:2010-04-27 05:49:44

标签: php mysql http-status-code-404

好的,我在MySQL表中有一个URL列表。我希望脚本自动检查表中的每个链接是否为404,然后我希望它存储URL是否为404,以及存储上次检查的时间。

即使没有人运行脚本,这甚至可以自动执行吗?即,没有人访问该页面几天,但即使没有人访问该页面,它也会自动进行测试。

如果可能的话,我怎么能按下按钮来做这个?

4 个答案:

答案 0 :(得分:2)

无需使用CURL,file_get_contents($url);将在请求失败时返回false(除了2xx之外的任何其他HTTP代码),这可能对您尝试执行的操作更有用,例如:

function urlExists($url)
{
    return (bool) @file_get_contents($url);
}

如果URL返回有用内容,则返回true,否则返回false。


编辑:这是一种更快的方式(它只请求标题)和第一个字节而不是整个页面:

function urlExists($url)
{
    return (bool) @file_get_contents($url, false, null, 0, 1);
}

urlExists('https://stackoverflow.com/iDontExist'); // false

然而,结合your other question,使用类似的东西可能更明智:

function url($url)
{
    return @file_get_contents($url);
}

$content = url('https://stackoverflow.com/');

// request has failed (404, 5xx, etc...)
if ($content === false)
{
    // delete or store as "failed" in the DB
}

// request was successful
else
{
    $hash = md5($content); // md5() should be enough but you can also use sha1()

    // store $hash in the DB to keep track of changes
}

或者,如果您使用的是PHP 5.1+,则只需执行以下操作:

$hash = @md5_file($url);
当URL无法加载时,

$hash将为false,否则它将返回内容的MD5哈希值。

慷慨地stolen from @Jamie。 =)

这样您只需要提出一个请求而不是两个请求。 =)

答案 1 :(得分:1)

您可以使用cron作业来执行此操作。使用您在脚本运行时选择的cron作业,例如每小时,每6小时等等......

要检查404,您可以遍历网址并每次都使用get_headers更新状态行。

答案 2 :(得分:0)

尝试使用curl

// $url <= The URL from your database
$curl = curl_init($url);
curl_setopt($curl,  CURLOPT_RETURNTRANSFER, TRUE);
$curl_response = curl_exec($curl);
if(curl_getinfo($curl, CURLINFO_HTTP_CODE) == 404) 
{
  // Save in database.
}
curl_close($curl);

如果您在共享主机服务器上运行,请查找设置定时操作(cron作业)的可能性。有些托管服务有,有些没有。

答案 3 :(得分:0)

我建议您同时使用curl,但请HEAD代替GET

<?php
function check_url($url) {
    $c = curl_init();
    curl_setopt($c, CURLOPT_URL, $url);
    curl_setopt($c, CURLOPT_HEADER, 1); // get the header
    curl_setopt($c, CURLOPT_NOBODY, 1); // and *only* get the header
    curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); // get the response as a string from curl_exec(), rather than echoing it
    curl_setopt($c, CURLOPT_FRESH_CONNECT, 1); // don't use a cached version of the url
    if (!curl_exec($c)) { return false; }

    $httpcode = curl_getinfo($c, CURLINFO_HTTP_CODE);
    return $httpcode;
}
?>

here取得的Snipplet。

可以通过* nix cron命令实现重复执行。