PHP致命错误:带有消息的未捕获异常“异常”

时间:2009-07-22 13:04:43

标签: php error-handling

我有一个PHP脚本连接到api并将信息发布到他们的系统,但是当它尝试连接它时会引发一个致命的错误:

Fatal error: Uncaught exception 'Exception' with message 'Problem with
'http://apitestserver.co.uk:9000/Service.svc/Items' in
/var/www/html/e/connect_test.php:17 Stack trace: #0 
/var/www/html/e/connect_test.php(39): 
do_http_request('http://apitest....', 'hello') #1 {main} thrown in 
/var/www/html/e/connect_test.php on line 17

如果我将它发送到只抓取IP的PHP脚本,那么它可以正常工作,但如果我将它发送到API则不然。我的PHP脚本创建XML然后转发到服务器。我收到错误所以我只是创建了以下较小的脚本,纯粹是为了测试连接:

function do_http_request($url, $data, $method = 'POST', 
    $optional_headers = 'Content-Type: application/atom+xml') {

  $params = array(
    'http' => array(
        'method' => $method,
        'content' => $data
    )
  );

  if ($optional_headers !== null) {
    $params['http']['header'] = $optional_headers;
  }

  $ctx = stream_context_create($params);
  $fp = fopen($url, 'rb', false, $ctx);
  if (!$fp) {
    throw new Exception("Problem with $url");
  }

  $response = @stream_get_contents($fp);
  if ($response === false) {
    throw new Exception("Problem reading data from $url");
  }

  $metaData = stream_get_meta_data($fp);
  fclose($fp);

  if(!preg_match('~^HTTP.*([0-9]{3})~', 
    $metaData['wrapper_data'][0], $matches)){
    throw new Exception('MALFORED RESPONSE - COULD NOT UNDERSTAND HTTP CODE');
  }
  if (substr($matches[1], 0, 1) != '2') {
    throw new Exception('SERVER REPORTED HTTP ERROR ' . $matches[1]);
  }
  return $response;
}
$data = 'hello';
$paul = 
  do_http_request('http://apitestserver.co.uk:9000/Service.svc/Items',$data);

echo $paul;

如果我将URL更改为另一台服务器上的简单脚本,这些脚本只是获取传入连接的IP并返回它:

 $ip=$_SERVER['REMOTE_ADDR'];
 echo 'IP equals = ' . $ip;

然后它可以正常工作而没有错误。

更新 -

有错误会抛出以下警告,可能是因为脚本没有向API发送正确的信息

Warning: fopen(http://apitestserver.co.uk:9000/Service.svc/Items) 
[function.fopen]: failed to open stream: HTTP request failed! HTTP/1.1 
500 Data at the root level is invalid. Line 1, position 1.

另请注意,我可以使用fiddler轻松访问api服务器以发送手动创建的项目,只有当此脚本尝试连接并发送数据时才会出现问题。我写了另一个快速脚本,连接并打印出默认响应(提交项目的RSS提要)

当我运行'main'连接器脚本时,它会抛出以下两个错误

Warning: fopen() [function.fopen]: php_network_getaddresses: 
getaddrinfo failed: Name or service not known in 
/var/www/html/e/sequence.php on line 65

Warning: fopen(http://apitestserver.co.uk:9000/Service.svc/Items) 
[function.fopen]: failed to open stream: Operation now in progress 
in /var/www/html/e/sequence.php on line 65

5 个答案:

答案 0 :(得分:1)

我刚在浏览器中测试了网址并遇到连接错误。

问题可能在于他们的服务器(或者您的网址错误)?

编辑:

看起来服务器正在抛出500错误 - 可能是因为您发布的数据无效。

您可以使用数据包嗅探器并检查您发送到服务器的确切数据(或使用@acrosman建议的cURL)

答案 1 :(得分:1)

apitestserver.co.uk不响应ping并且网址无法访问。 API服务器似乎没有启动。

答案 2 :(得分:1)

我建议使用curl代替fopen()。卷曲更灵活,更安全。许多服务器禁用allow_url_fopen,当远程服务器出现问题时,curl也会更优雅地失败。

答案 3 :(得分:0)

第一条错误消息表明apitestserver存在问题 - 它返回错误代码500,其中指出“内部服务器错误”。

第二个告知PHP无法将主机名解析为IP地址 - 我会查看DNS配置和/或主机文件。


显然'fopen'功能不会返回正确的流。发生这种情况时可能有很多种可能性,但根据PHP手册,fopen函数on fail应该在E_WARNING消息中显示正确的注释。您可能会将该类的错误置为无效 - 在脚本开头调用error_reporting(E_ALL)并查找一些相关的错误消息。

答案 4 :(得分:0)

或您可以更改标题:

$optional_headers = 'Content-Type: application/json')