"PHP致命错误:未捕获异常'Exception',信息为"

4

我有一个连接到API并将信息发布到其系统的PHP脚本,但在尝试连接时会抛出致命错误:

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源)。
当我运行“主”连接器脚本时,它会抛出以下两个错误。
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

我建议这可能与你使用的数组有关,首先测试一下该键是否存在,然后再使用它。 - Anriëtte Myburgh
smoove666,是的,它可以正常工作,但它是一个封闭的服务器,所以你能删除对它的引用吗? 我可以通过浏览器访问它,也可以使用脚本访问并解析它提供的响应。 - Paul M
5个回答

1

我刚刚在浏览器中测试了这个 URL,但遇到了连接错误。

可能问题出在他们的服务器上(或者你输入的 URL 不正确)?

编辑:

看起来服务器返回了 500 错误 - 可能是因为你发送的数据有误。

你可以使用数据包捕获工具检查向服务器发送的精确数据(或像 @acrosman 建议的那样使用 cURL)。


1
这个人只是删除了真实的URL并放置了一个虚假的,以便没有人能够访问它。 "apitestserver.co.uk" 应该已经很清楚了 ;) - FWH
是的,apitestserver是一个伪造的服务器,因为原始服务器是私有的,并且被防火墙锁定,所以无论如何都没有人能够看到它!但是我可以从服务器上访问它,正如我的更新所说。 - Paul M
是的,你发现得很对,因为我没有向API发送正确的数据。我将在主脚本中更新我的主线程中的错误。 - Paul M

1

apitestserver.co.uk无法响应ping请求,URL不可访问。API服务器似乎已经关闭。


这是一个封闭的测试服务器,如果防火墙不允许通过,您将无法访问它。但由于它是一个封闭的服务器,所以请删除与之相关的引用 :) 我以为我已经在原始帖子中替换了所有实例。 - Paul M
请注意,我可以正常访问它,并且还可以使用简单的脚本访问它,该脚本打开、读取并打印API作为默认返回的XML。 - Paul M

1
我建议使用curl而不是fopen()。curl更加灵活和安全。许多服务器禁用allow_url_fopen,当远程服务器出现问题时,curl也会更加优雅地失败。

没有经常使用过Curl,你有什么指导用哪些函数吗? - Paul M
在php.net的示例页面上,有一个非常好的示例是在6月份发布的:http://us3.php.net/manual/en/curl.examples.php - acrosman

0

或者您可以更改标头:

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

0

首个错误信息提示问题出在apitestserver上 - 它返回了500的错误代码,这表示“内部服务器错误”。

第二个错误则是通知说PHP无法将主机名解析为IP地址 - 我会检查DNS配置和/或hosts文件。


显然,'fopen'函数没有返回正确的流。当发生这种情况时,可能有许多可能性,但根据PHP手册,fopen函数在失败时应该呈现带有适当评论的E_WARNING消息。有可能您已经将该类错误静音 - 在脚本开头调用error_reporting(E_ALL),并查找一些相关的错误消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接