MySQL tablodan kontrol Otomatik URL

4 Cevap php

Tamam, bir MySQL tablo bir URL listesi var. Ben script otomatik 404 için tablodaki her bağlantıyı kontrol etmek istiyorum, ve sonra ben son kontrol için bir zaman URL 404'd veya olup olmadığını saklamak, aynı zamanda mağaza istiyorum.

Bu kimse senaryoyu bitse bile, otomatik olarak yapmak bile mümkün mü? yani, hiç kimse birkaç gün sayfasını ziyaret, ama bile kimse sayfasını ziyaret ile, otomatik test koştu.

Olası, nasıl bunu yapmak için bir düğme yapma konusunda gidebiliriz?

4 Cevap

Isteği, bir örnek yapmaya çalıştığınız şey için daha yararlı olabilir (2xx dışında herhangi bir HTTP kodu), başarısız olursa CURL kullanmaya gerek yok, file_get_contents($url); return false:

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

URL aksi takdirde yanlış yararlı içerik, dönerse true dönecektir.


EDIT: İşte daha hızlı bir şekilde (sadece başlıkları istekleri) ve the first byte yerine tam sayfa olduğunu:

function urlExists($url)
{
    return (bool) @file_get_contents($url, false, null, 0, 1);
}

urlExists('http://stackoverflow.com/iDontExist'); // false

Ancak, birlikte your other question bunun gibi bir şey kullanmak akıllıca olabilir:

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

$content = url('http://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
}

Yoksa PHP 5.1 + kullanarak eğer sadece yapmak zorunda:

$hash = @md5_file($url);

URL yükleme başarısız olduğunda $hash aksi takdirde içeriğinin MD5 hash dönecektir, yanlış olacaktır.

Nezaketle stolen from @Jamie. =)

Bu şekilde sadece iki yerine bir istek yapmak zorunda. =)

Bunu yapmak için bir cron işi kullanabilirsiniz. Komut örneğin çalıştırdığınızda seçtiğiniz bir cron işi kullanma her saat, her 6 saatte bir, vs ..

Adresler üzerinden 404 yapabilirsiniz döngü kontrol ve get_headers bir durum satırı her zaman güncelleyerek kullanın.

Kullanmayı deneyin 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);

Eğer bir hosting sunucu üzerinde çalışıyorsa, zamanlanmış eylemler (cron jobs) kurma imkanı arayın. Bazı barındırma hizmetleri bazı yoktur, buna sahip.

Ben de curl kullanmanızı öneririz, ancak yerine HEAD istek yapar 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 alınan Snipplet.

Tekrarlanan yürütme * nix cron komutu ile elde edilebilir.