好的,我在MySQL表中有一个URL列表。我希望脚本自动检查表中的每个链接是否为404,然后我希望它存储URL是否为404,以及存储上次检查的时间。
即使没有人运行脚本,这甚至可以自动执行吗?即,没有人访问该页面几天,但即使没有人访问该页面,它也会自动进行测试。
如果可能的话,我怎么能按下按钮来做这个?
答案 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命令实现重复执行。