Автоматическая проверка URL из таблицы MySQL - PullRequest
1 голос
/ 27 апреля 2010

Хорошо, у меня есть список URL-адресов в таблице MySQL. Я хочу, чтобы скрипт автоматически проверял каждую ссылку в таблице на 404, а затем я хочу, чтобы он сохранял, был ли URL-адрес 404 или нет, а также сохраняет время последней проверки.

Возможно ли это сделать автоматически, даже если никто не запускает скрипт? то есть никто не посещает страницу в течение нескольких дней, но даже если никто не посещает страницу, он автоматически запускает тест.

Если это возможно, как я могу сделать кнопку для этого?

Ответы [ 4 ]

2 голосов
/ 27 апреля 2010

Нет необходимости использовать CURL, file_get_contents($url); вернет false в случае сбоя запроса (любой другой код HTTP, кроме 2xx), что может быть более полезно для того, что вы пытаетесь сделать, например:

function urlExists($url)
{
    return (bool) @file_get_contents($url);
}

Возвращает true, если URL возвращает полезное содержимое, в противном случае - 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);

$hash будет иметь значение false, если URL-адрес не загружается, в противном случае он вернет MD5-хэш содержимого.

Милостиво украдено у @ Джейми . =) * * 1 029

Таким образом, вам нужно сделать только один запрос вместо двух. =) * * Тысяча тридцать одна

1 голос
/ 27 апреля 2010

Для этого вам понадобится работа cron. Используя задание cron, которое вы выбираете при запуске скрипта, например каждый час, каждые 6 часов и т.д ...

Для проверки 404 вы можете перебрать URL-адреса и использовать get_headers , каждый раз обновляя строку состояния.

0 голосов
/ 27 апреля 2010

Я бы тоже рекомендовал использовать 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.

0 голосов
/ 27 апреля 2010

Попробуйте использовать 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). Некоторые услуги хостинга есть, некоторые нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...