当url不存在时,file_get_contents
我正在使用file_get_contents()来访问一个URL。
file_get_contents('http://somenotrealurl.com/notrealpage');
如果URL不是真实的,则返回此错误消息。 我怎么才能得到它的错误,以便我知道该网页不存在,并采取相应的行动,而不显示此错误消息?
file_get_contents('http://somenotrealurl.com/notrealpage') [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 404 Not Found in myphppage.php on line 3
例如在zend你可以说: if ($request->isSuccessful())
$client = New Zend_Http_Client(); $client->setUri('http://someurl.com/somepage'); $request = $client->request(); if ($request->isSuccessful()) { //do stuff with the result }
您需要检查HTTP响应代码 :
function get_http_response_code($url) { $headers = get_headers($url); return substr($headers[0], 9, 3); } if(get_http_response_code('http://somenotrealurl.com/notrealpage') != "200"){ echo "error"; }else{ file_get_contents('http://somenotrealurl.com/notrealpage'); }
在PHP中使用这样的命令,你可以用@
作为前缀来禁止这样的警告。
@file_get_contents('http://somenotrealurl.com/notrealpage');
如果发生故障, file_get_contents()返回FALSE
,所以如果你检查返回的结果,那么你可以处理失败
$pageDocument = @file_get_contents('http://somenotrealurl.com/notrealpage'); if ($pageDocument === false) { // Handle error }
每次使用http包装器调用file_get_contents
时,都会创build一个本地作用域中的variables: $ http_response_header
这个variables包含所有的HTTP标题。 这个方法比get_headers()
函数更好,因为只有一个请求被执行。
注意:2个不同的请求可以结束不同。 例如, get_headers()
将返回503,file_get_contents()将返回200.并且,您将得到正确的输出,但由于get_headers()调用中的503错误而不会使用它。
function getUrl($url) { $content = file_get_contents($url); // you can add some code to extract/parse response number from first header. // For example from "HTTP/1.1 200 OK" string. return array( 'headers' => $http_response_header, 'content' => $content ); } // Handle 40x and 50x errors $response = getUrl("http://example.com/secret-message"); if ($response['content'] === FALSE) echo $response['headers'][0]; // HTTP/1.1 401 Unauthorized else echo $response['content'];
这个aproach也允许你跟踪很less的请求头存储在不同的variables,因为如果你使用file_get_contents() $ http_response_header覆盖本地范围。
虽然file_get_contents
是非常简洁和方便,我倾向于更好地控制Curl库。 这是一个例子。
function fetchUrl($uri) { $handle = curl_init(); curl_setopt($handle, CURLOPT_URL, $uri); curl_setopt($handle, CURLOPT_POST, false); curl_setopt($handle, CURLOPT_BINARYTRANSFER, false); curl_setopt($handle, CURLOPT_HEADER, true); curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, 10); $response = curl_exec($handle); $hlength = curl_getinfo($handle, CURLINFO_HEADER_SIZE); $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE); $body = substr($response, $hlength); // If HTTP response is not 200, throw exception if ($httpCode != 200) { throw new Exception($httpCode); } return $body; } $url = 'http://some.host.com/path/to/doc'; try { $response = fetchUrl($url); } catch (Exception $e) { error_log('Fetch URL failed: ' . $e->getMessage() . ' for ' . $url); }
简单而实用(易于使用):
function file_contents_exist($url, $response_code = 200) { $headers = get_headers($url); if (substr($headers[0], 9, 3) == $response_code) { return TRUE; } else { return FALSE; } }
例:
$file_path = 'http://www.google.com'; if(file_contents_exist($file_path)) { $file = file_get_contents($file_path); }
为了避免双方的要求,由Orbling评论ynh的答案,你可以结合他们的答案。 如果您首先得到有效的答复,请使用该答案。 如果没有找出问题是什么(如果需要的话)。
$urlToGet = 'http://somenotrealurl.com/notrealpage'; $pageDocument = @file_get_contents($urlToGet); if ($pageDocument === false) { $headers = get_headers($urlToGet); $responseCode = substr($headers[0], 9, 3); // Handle errors based on response code if ($responseCode == '404') { //do something, page is missing } // Etc. } else { // Use $pageDocument, echo or whatever you are doing }