2013-04-02 33 views
13

破我不知道是否有任何好的PHP腳本(庫),以檢查是否鏈接被打破?我有鏈接到MySQL表中的文檔,並可能只是檢查鏈接是否導致文檔,或者如果我重定向到其他網址。任何想法?我寧願用PHP來做。檢查鏈接在PHP

可能涉及: Check link works and if not visually identify it as broken

+0

相關主題看起來很相關。 – Kermit

+3

檢查響應頭使用curl和發佈您的代碼與特定問題 – Ejaz

+0

是此鏈接的其他網站上自己的網站或者內容的一些內容? – Touch

回答

24

您可以檢查使用此功能斷開的鏈接:

function check_url($url) { 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1); 
    $data = curl_exec($ch); 
    $headers = curl_getinfo($ch); 
    curl_close($ch); 

    return $headers['http_code']; 
} 

你需要有CURL安裝了這個工作。現在,您可以檢查使用損壞的鏈接:

$check_url_status = check_url($url); 
if ($check_url_status == '200') 
    echo "Link Works"; 
else 
    echo "Broken Link"; 

還要檢查該鏈接,HTTP狀態代碼:HTTP Status Codes

我想你也可以檢查301302狀態代碼。

也是另一種方法是使用get_headers功能。但是,這隻有當你的PHP版本大於5:

function check_url($url) { 
    $headers = @get_headers($url); 
    $headers = (is_array($headers)) ? implode("\n ", $headers) : $headers; 

    return (bool)preg_match('#^HTTP/.*\s+[(200|301|302)]+\s#i', $headers); 
} 

在這種情況下,只需檢查輸出:

if (check_url($url)) 
    echo "Link Works"; 
else 
    echo "Broken Link"; 

希望這可以幫助您:)。

+0

有沒有可能從數據庫做到這一點?鏈接文件的列表將不得不隨新文件的添加和更新而更新。我認爲我們的工作人員在每次有變化時都要手動更新腳本,這有點困難嗎?順便說一句,謝謝你的回答,讓我有一個開始的地方。 – StenW

+1

如果你想更新數據庫,然後寫一些查詢獲取信息,然後從中獲取鏈接,並使用php檢查並更新回 – Sabari

+0

請注意,301不會重定向到402.或者該網站是402 ,但吐出了一個301.就像現在我知道這個網站已經關閉了,但是正在返回一個301.有一次,我有402個返回。但上面的代碼認爲該網站是有效的,當它不是。 –

2

由於快速的解決方法檢查,您可以使用全局變量$http_response_headerfile_get_contents()功能。

例如(來自PHP文檔中提取):

<?php 
function get_contents() { 
    file_get_contents("http://example.com"); 
    var_dump($http_response_header); 
} 
get_contents(); 
var_dump($http_response_header); 

然後檢查在第一行中的狀態碼爲 「HTTP/1.1 200 OK」 或其他HTTP status codes

+0

這不是一個好主意。如果服務器未找到或正在響應,某些PHP Installtions會顯示警告。 – idmean

+0

您不應在生產服務器中使用display_errors或error_reporting。對於捕獲錯誤,也可以使用@沉默運算符或register_shutdown_function http://php.net/manual/es/function.register-shutdown-function.php – shakaran

1

試試這個:

$url = '[your_url]'; 
$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, $url); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 

$result = curl_exec($curl); 

if ($result === false) { 
    echo 'broken url'; 
} else { 
    $newUrl = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL); 

    if ($newUrl !== $url) { 
     echo 'redirect to: ' . $newUrl; 
    } 
} 
curl_close($curl); 
4

您可以在幾個方面做到這一點:

第一種方式 - 捲曲

function url_exists($url) { 
    $ch = @curl_init($url); 
    @curl_setopt($ch, CURLOPT_HEADER, TRUE); 
    @curl_setopt($ch, CURLOPT_NOBODY, TRUE); 
    @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE); 
    @curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
    $status = array(); 
    preg_match('/HTTP\/.* ([0-9]+) .*/', @curl_exec($ch) , $status); 
    return ($status[1] == 200); 
} 

方式二 - 如果你沒有捲曲安裝 - 獲得頭

function url_exists($url) { 
    $h = get_headers($url); 
    $status = array(); 
    preg_match('/HTTP\/.* ([0-9]+) .*/', $h[0] , $status); 
    return ($status[1] == 200); 
} 

氏RD方式 - 的fopen

function url_exists($url){ 
    $open = @fopen($url,'r'); 
    if($handle !== false){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

First & second solutions

+1

哪種方法最快,最少資源渴? – danyo

+0

第三種方法中的$ handle是什麼? @Orel Biton – NomanJaved