Php 从MySQL表自动检查URL
好的,我有一个MySQL表中的URL列表。我希望脚本自动检查表中的每个链接是否为404,然后我希望它存储URL是否为404,以及存储上次检查的时间 即使没有人运行脚本,也可以自动执行此操作吗?也就是说,有几天没有人访问该页面,但即使没有人访问该页面,它也会自动运行测试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
如果可能的话,我如何制作一个按钮来实现这一点呢?您可以使用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)如果请求失败(2xx以外的任何其他HTTP代码),code>将返回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是错误的。