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

问题描述:

我有一个连接到API和岗位信息到他们的系统PHP脚本,但是当它试图连接它抛出一个致命的错误: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 

如果我把它发送到一个PHP脚本,它只是抓住IP然后它可以工作,但是如果我把它发送到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. 

另外请注意,我可以使用访问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 
+0

我会建议它是与您正在使用,第一次测试如果键存在的数组,然后使用它。 – 2009-07-22 13:11:25

+0

smoove666是的,它工作正常,但它是一个封闭的服务器,所以你可以删除对它的引用? 我可以通过浏览器访问它,我也可以通过脚本访问它并解析它提供的响应。 – 2009-07-22 13:30:02

我会建议使用curl而不是fopen()。卷曲更灵活,更安全。许多服务器禁用allow_url_fopen,当远程服务器出现问题时,curl也会失败得更加正常。

我只是测试在我的浏览器中的URL,并得到一个连接错误。

也许问题出在他们的服务器上(或者你有错误的URL)?

编辑:

貌似疗法服务器抛出一个500错误 - 也许因为你张贴的数据是无效的。

你可以使用一个数据包嗅探器,来查看您向服务器发送的确切数据(或使用卷曲通过@acrosman的建议)

+1

这个人刚刚删除了真实的网址,并放置了一个假的网址,所以没有人会访问它。 “apitestserver.co.uk”应该已经足够清晰;) – FWH 2009-07-22 13:18:42

+0

是啊apitestserver是一个真正的原始的私人和锁在防火墙后面,所以没有人能够看到它!但我可以从服务器*问它,正如我的更新所述。 – 2009-07-22 13:37:40

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

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

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


显然'fopen'函数没有返回正确的流。发生这种情况时可能会有很多种可能性,但根据PHP手册,fopen函数在失败时应该提供E_WARNING消息并提供适当的注释。您可能会遇到该类的错误消息 - 在脚本开始处调用error_reporting(E_ALL)并查找一些相关的错误消息。

或者您可以更改标题:

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