Php 从MySQL表自动检查URL

Php 从MySQL表自动检查URL,php,mysql,http-status-code-404,Php,Mysql,Http Status Code 404,好的,我有一个MySQL表中的URL列表。我希望脚本自动检查表中的每个链接是否为404,然后我希望它存储URL是否为404,以及存储上次检查的时间 即使没有人运行脚本,也可以自动执行此操作吗?也就是说,有几天没有人访问该页面,但即使没有人访问该页面,它也会自动运行测试 如果可能的话,我如何制作一个按钮来实现这一点呢?您可以使用cron作业来实现这一点。使用脚本运行时选择的cron作业,例如每小时、每6小时等 要检查404,您可以循环浏览URL并使用每次更新状态行。尝试使用curl: // $ur

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

即使没有人运行脚本,也可以自动执行此操作吗?也就是说,有几天没有人访问该页面,但即使没有人访问该页面,它也会自动运行测试


如果可能的话,我如何制作一个按钮来实现这一点呢?

您可以使用cron作业来实现这一点。使用脚本运行时选择的cron作业,例如每小时、每6小时等


要检查404,您可以循环浏览URL并使用每次更新状态行。

尝试使用
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);

/$url无需使用CURL,
文件获取内容($url)将返回false,这可能对您尝试执行的操作更有用,例如:

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

但是,与之结合,使用以下内容可能更明智:

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哈希

优雅地……)


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

我建议也使用
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;
}
?>

很抱歉反应太晚。我有点忙。非常感谢,@md5_file();太好了。但是,你能告诉我,函数前面的“@”是用来做什么的吗?Rob:是为了避免在url加载失败时抛出错误的函数。因此,如果我把它放在我的curl_multi_exec(如@curl_multi_exec())中,它将运行所有url,而不管有什么错误?(有关更多信息,请参见我的开放式问题)@Rob:
@
操作符仅抑制抛出的错误,仅此而已。关于你的另一个问题,你使用curl_multi是错误的。