好的,我有一個MySQL表中的URL列表。我希望腳本自動檢查表格中的每個鏈接是否爲404,然後我希望它能存儲URL是否爲404'd,以及存儲最後一次檢查的時間。從MySQL表中自動檢查URL
即使沒有人運行腳本,這甚至可以自動執行嗎?即幾天沒有人訪問該頁面,但即使沒有人訪問該頁面,它也會自動運行測試。
如果可能的話,我怎麼可以做一個按鈕來做到這一點?
好的,我有一個MySQL表中的URL列表。我希望腳本自動檢查表格中的每個鏈接是否爲404,然後我希望它能存儲URL是否爲404'd,以及存儲最後一次檢查的時間。從MySQL表中自動檢查URL
即使沒有人運行腳本,這甚至可以自動執行嗎?即幾天沒有人訪問該頁面,但即使沒有人訪問該頁面,它也會自動運行測試。
如果可能的話,我怎麼可以做一個按鈕來做到這一點?
無需使用捲曲,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);
$hash
會是假的時,網址無法加載,否則將返回內容的MD5哈希值。
恩惠地stolen from @Jamie。 =)
這樣你只需要做一個請求而不是兩個。 =)
您將使用cron作業來執行此操作。使用腳本運行時選擇的cron作業,例如每小時,每6小時等...
要檢查404,您可以遍歷URL並使用get_headers每次更新狀態行。
嘗試使用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作業)的可能性。有些託管服務有它,有些則不。
我會建議使用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;
}
?>
Snipplet從here拍攝。
通過* nix cron命令可以實現重複執行。
對不起,遲到的遲到迴應。有點忙。非常感謝,@ md5_file();是很棒的。你能告訴我,函數前面的'@'是什麼? – Rob 2010-04-29 00:55:38
Rob:避免加載url失敗時拋出錯誤的功能。 – 2010-04-29 14:08:43
因此,如果我把它放在我的curl_multi_exec(如@curl_multi_exec();)中,它會運行所有的URL而不管錯誤? (有關更多信息,請參閱我的未解答問題) – Rob 2010-04-29 17:57:43