Хорошо, у меня есть список URL-адресов в таблице MySQL. Я хочу, чтобы скрипт автоматически проверял каждую ссылку в таблице на 404, а потом я хочу, чтобы он хранил, был ли URL-адрес 404'd или нет, а также сохранить время для последнего проверки.
Можно ли сделать это даже автоматически, даже если никто не запускает скрипт? т.е. никто не посещает страницу в течение нескольких дней, но даже без посещения страницы она автоматически запускает тест.
Если возможно, как я могу сделать кнопку, чтобы сделать это?
Нет необходимости использовать CURL, file_get_contents($url);
вернет false, если запрос не удался (любой другой HTTP-код, отличный от 2xx), что может быть более полезным для того, что вы пытаетесь сделать, пример:
function urlExists($url) { return (bool) @file_get_contents($url); }
Вернет true, если URL-адрес возвращает полезный контент, иначе false.
EDIT : это более быстрый способ (он запрашивает только заголовки) и первый байт вместо всей страницы:
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);
$hash
будет false, если URL-адрес не будет загружен, иначе он вернет хеш-файл MD5 содержимого.
Милостиво украден у @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
, но вместо запроса GET
сделайте запрос HEAD
:
<?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; } ?>
Снейпп взят отсюда .
Повторное выполнение может быть достигнуто командой * nix cron.