当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 }