2011-03-29 50 views
2

我正在使用PHP fopen()向ASP.NET MVC端點發出GET請求。當請求成功時,會有一個空的響應和一個HTTP 204狀態碼。爲什麼當響應是HTTP 204(空內容)時,fopen會發出警告?

但是,fopen正在發出警告,所以我試圖找出解決這個問題的最佳方法。

$handle = fopen("http://myservice.com/test.php?foo=bar", "r"); 

警告是:

Warning: fopen(http://myservice.com/test.php?foo=bar) [function.fopen]: failed to open stream: HTTP request failed! HTTP/1.1 204 No Content in E:\web\test.php on line 18 

我很困惑,爲什麼是的fopen連拋警告。處理這個問題的最好方法是什麼?我應該:

  1. 帶有「@」的前綴fopen調用來抑制警告?
  2. 更改web服務返回一些內容,如「確定」,所以狀態將是一個HTTP 200 OK?
  3. ...別的東西?

回答

4

是的,它不應該。所有20x狀態碼都應該被視爲確定。但它可能取決於您的PHP版本。從PHP5.3開始,它會檢查response_code >= 200 and < 400,並且只會抱怨。

但是PHP 5.2例如:http://svn.php.net/repository/php/php-src/branches/PHP_5_2/ext/standard/http_fopen_wrapper.c包含此tidbid:

 switch(response_code) { 
      case 200: 
      case 206: /* partial content */ 
      case 302: 
      case 303: 
      case 301: 
       reqok = 1; 
       break; 

這不包括你的204狀態代碼,並可以解釋爲什麼下面的代碼觸發警告。 (至少不需要提交錯誤報告,因爲它顯然已經是這樣了。)

在這種情況下,我不確定它是否適合您的用例,應謹慎使用,但@的確會壓制警告。

+0

感謝解決方案的細節以及原因。我的服務器確實運行PHP 5.2。 – TMC 2011-03-29 17:37:14

0

如果你正在做的是檢查響應,你可能想看看:http://us3.php.net/manual/en/function.get-headers.php

編輯:我只是看着我的一些代碼,獲取HTTP狀態,它看起來像我我一直在使用抑制操作。此代碼已生產多年,並且沒有任何問題(除了依靠fopen URL封裝):

$fp = @fopen($url, 'rb'); 
if (isset($http_response_header[0])) $http_status = $http_response_header[0]; 
if ($fp) fclose($fp); 
相關問題