2011-08-15 16 views
2

我使用get_meta_tags()在腳本和某些網址,它失敗了與(作爲一個例子)...錯誤處理get_meta_tags()和重定向限制?

警告:get_meta_tags(http://www.kodak.com/) function.get-meta-tags]:未能打開流:已達到重定向限制...

是否可以跳過導致錯誤的結果?還是應該使用@get_meta_tags()來代替?

function getMeta() 
{ 
    $tags = get_meta_tags($this->link); //INSERT INTEGRITY CHECK HERE? 
    $keywords = $tags['keywords']; 

    if(count($keywords)) 
    { 
     preg_match_all('/(?<=^|,)\s*((?:[^\s,]+\s*){1,4})(?=\s*(?:,|$))/', $keywords, $m); 
     $this->keywords = array_slice($m[1], 0, 15); 
    } 
} 

回答

2

您可以在致電get_meta_tags()之前直接使用error suppression operator - the @ character。這樣做的效果是隻將該行的所有錯誤報告都關閉,但通常被認爲是不好的做法,只有在其他選項全部耗盡時纔會使用。

您對這個第一反應應該是儘量規範網址傳遞給get_meta_tags()在可能的情況 - 即你應該嘗試通過在URL重定向鏈的末端。例如,鏈接http://www.php.net/manual/en/language.types.array.php而非http://php.net/array。如果$this-link來自源在你的控制,然而,使用錯誤抑制可能是你最好的選擇:

$tags = @get_meta_tags($this->link); 

這在功能上與此相同:

您可以按如下方式使用它

$errorLevel = error_reporting(0); 
$tags = get_meta_tags($this->link); 
error_reporting($errorLevel); 

您需要更改代碼的其餘部分才能處理不包含元標記數組的$tags變量。

+0

的鏈接從谷歌搜索的屏幕抓取來爲給定的搜索查詢。雖然我不認爲它是一個典型問題,但它的鏈接完美無缺並且格式良好(www.kodak.com),不是嗎? – RegEdit

+0

@RegEdit - 我所說的「規範鏈接」是指「重定向鏈末尾的鏈接」。如果您訪問kodak.com,它可能會檢測到您的位置並重定向到本地化網站,然後可能會將其重定向到其他網站。規範鏈接是您在瀏覽最終頁面時最終在瀏覽器中顯示的URL。基本上,我告訴你要儘可能地限制重定向,阻止重定向限制的到達,這樣就不會拋出錯誤。如果你不能這樣做,那麼你的下一個最好的選擇就是默默地忽略這個錯誤。 – AgentConundrum

+0

@RegEdit - 如果你通過屏幕抓取拉取URL,你很難做重定向,因此可能需要使用'@'。唯一的其他選擇是通過set_error_handler()將錯誤轉換爲異常,然後在try-catch塊中運行get_meta_tags()調用,並檢查catch以確定是否「已經達到了重定向限制。這與使用錯誤抑制運算符幾乎相同,但僅用於抑制要抑制的錯誤的額外優點。儘管如此,這很可能過火了。 – AgentConundrum

1

我不使用錯誤抑制同意,但也有少數例外它派上用場。

function getMeta() 
{ 
    if ($tags = @get_meta_tags($this->link)) { 
     $keywords = $tags['keywords']; 

     if (count($keywords)) { 
      preg_match_all('/(?<=^|,)\s*((?:[^\s,]+\s*){1,4})(?=\s*(?:,|$))/', $keywords, $m); 
      $this->keywords = array_slice($m[1], 0, 15); 
     } 
    } else { 
     // Catch error 
    } 
} 

被警告說,@錯誤抑制將抑制所有錯誤,而不是剛剛突破重定向限制。 See docs

0

這一個抑制所有錯誤,但不正是一件事情你正在尋找

function getMeta() 
{ 
    $tags = @get_meta_tags($this->link); //INSERT INTEGRITY CHECK HERE? 
    if (!$tags){ 
     //handle your error 
    } 

    $keywords = $tags['keywords']; 

    if(count($keywords)) 
    { 
     preg_match_all('/(?<=^|,)\s*((?:[^\s,]+\s*){1,4})(?=\s*(?:,|$))/', $keywords, $m); 
     $this->keywords = array_slice($m[1], 0, 15); 
    } 
}