2014-10-08 68 views
1

如果我使用錯誤代理在PHP 中運行此代碼,我得到500內部服務器錯誤。 如何處理它並繼續執行?如何使用file_get_contents與錯誤的代理處理500內部服務器錯誤?

$opts = array(
      'http'=>array(
      'method'=>"GET", 
      'proxy' => 'tcp://100.100.100.100:80' //a wrong proxy 
     ) 
); 

$context = stream_context_create($opts); 

$file = file_get_contents('http://ifconfig.me/ip', false, $context); 
+0

你是什麼意思的「處理它」? – 2014-10-08 15:11:09

+0

運行此代碼的機器發出500,或者您嘗試觸發的代理/ url發出500? – 2014-10-08 15:11:20

+0

運行此代碼的機器發出500.我不希望它停止下一個代碼。 – 2014-10-08 15:16:31

回答

3

我假定你的意思是兩件事情,當你說「處理」:

  1. 如果腳本連接到一個「錯誤」的代理,它會等待很長的時間來建立連接,直到它超時。該腳本應設置較低的超時時間,以便用戶不會永遠等待。
  2. 如果在訪問外部資源期間發生錯誤,請勿死亡或顯示醜陋的消息。相反,假裝一切都很酷。

至於1)遠程連接超時定義在PHP的default_socket_timeout設置中,默認爲60秒。你可以/應該設置一個低得多的超時爲自己的呼叫:

$opts = array(
     'http'=>array(
     'timeout'=> 2, // timeout of 2 seconds 
     'proxy' => 'tcp://100.100.100.100:80' //a wrong proxy 
    ) 
); 

至於2),您通常會使用一個try/catch塊。不幸的是,file_get_contents()是那些不會引發可捕獲異常的舊PHP函數之一。

您可以通過與@標誌前綴的函數調用剿一個可能的錯誤消息:

$file = @file_get_contents('http://ifconfig.me/ip', false, $context); 

但你不能在所有的處理任何錯誤。

如果你想至少有一些錯誤處理,你應該使用cURL。不幸的是,它也不會拋出異常。但是,如果發生cURL錯誤,可以使用curl_errno()/curl_error()來讀取它。

這裏是你的代碼捲曲實現:

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, "http://ifconfig.me/ip"); 
curl_setopt($ch, CURLOPT_PROXY, 'tcp://100.100.100.100:80'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 2); 
curl_setopt($ch, CURLOPT_HEADER, 1); 

$data = curl_exec($ch); 
$error = curl_errno($ch) ? curl_error($ch) : ''; 

curl_close($ch); 

print_r($error ? $error : $data); 

這種方式,你可以決定要在一個錯誤的情況下該怎麼做。

+0

此cURL方法將顯示cURL錯誤,如錯誤'58','CURLE_SSL_CERTPROBLEM'。它不會處理HTTP 500錯誤。對於那些,看看這個答案:http://stackoverflow.com/a/408416/1487413。此外,這段代碼出於某種原因將HTTP標頭粘貼到數據上,使用'CURLOPT_HEADER'。這不太方便。根據cURL手冊「如果沒有關於所用協議的詳細知識,不可能再次精確分離它們。」 – 2015-03-31 16:28:17