我假定你的意思是兩件事情,當你說「處理」:
- 如果腳本連接到一個「錯誤」的代理,它會等待很長的時間來建立連接,直到它超時。該腳本應設置較低的超時時間,以便用戶不會永遠等待。
- 如果在訪問外部資源期間發生錯誤,請勿死亡或顯示醜陋的消息。相反,假裝一切都很酷。
至於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);
這種方式,你可以決定要在一個錯誤的情況下該怎麼做。
來源
2014-10-08 19:26:59
lxg
你是什麼意思的「處理它」? – 2014-10-08 15:11:09
運行此代碼的機器發出500,或者您嘗試觸發的代理/ url發出500? – 2014-10-08 15:11:20
運行此代碼的機器發出500.我不希望它停止下一個代碼。 – 2014-10-08 15:16:31