2011-03-29 47 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); 
相关问题