2009-07-22 9 views
4

ich einen PHP-Skript, das auf eine api und Beiträgen Informationen, um ihre Systeme verbindet, aber wenn sein Versuch, es zu verbinden wirft einen fatalen Fehler:PHP fatale Fehler: abgefangene Ausnahme ‚Exception‘ with message

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 

Wenn ich es an ein PHP-Skript sende, das nur die IP-Adresse ergreift, funktioniert es, aber wenn ich es an die API sende, tut es das nicht. Mein PHP-Skript erstellt XML und leitet es dann an den Server weiter. Ich war immer Fehler so dass ich nur die folgenden kleineren Skript erstellt lediglich die Verbindung testen:

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; 

Wenn ich die URL auf ein einfaches Skript auf einem anderen einen unserer Server ändern, die nur die IP der eingehenden Verbindung packt und gibt es zurück:

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

Dann funktioniert es gut, ohne Fehler.

Update -

mit Fehlern auf sie wirft die folgende Warnung, wahrscheinlich, weil das Skript ist nicht die richtigen Informationen an die API Senden

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. 

Beachten Sie auch, dass ich die api Server fein zugreifen können Fiddler, um manuell erstellte Elemente zu verschicken, nur wenn dieses Skript versucht, eine Verbindung herzustellen und Daten zu senden, gibt es ein Problem. Ich schrieb ein weiteres schnelles Skript verbindet die und druckt die Standardantwort (einen RSS-Feed des eingereichten Artikels)

Als ich den ‚Haupt‘ Anschluss Skript ausführen wirft es die folgenden zwei Fehler

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

, dass es etwas mit der Arrays zu tun hat, die Sie verwenden, ersten Test, ob das Schlüssel vorhanden ist, verwenden Sie es dann. –

+0

smoove666 ja es funktioniert gut, aber es ist ein geschlossener Server, also können Sie den Verweis löschen? Ich kann mit einem Browser gut darauf zugreifen, ich kann auch mit einem Skript darauf zugreifen und die Antwort parsen. –

Antwort

1

Ich würde vorschlagen, curl anstelle von fopen() zu verwenden. curl ist sowohl flexibler als auch sicherer. Viele Server deaktivieren allow_url_fopen, curl schlägt auch auffälliger fehl, wenn auf dem Remote-Server Probleme auftreten.

+0

Habe Curl nicht viel benutzt, irgendwelche Zeiger auf welche Funktionen zu verwenden? –

+0

Es gibt ein ziemlich gutes Beispiel, das im Juni auf der Beispielseite von php.net gepostet wurde: http://us3.php.net/manual/en/curl.examples.php – acrosman

1

ich gerade getestet die URL in meinem Browser und einen Verbindungsfehler erhalten.

Vielleicht ist das Problem mit ihrem Server (oder Sie haben die falsche URL)?

Edit:

Sieht aus wie ther-Server einen 500-Fehler wirft - vielleicht, weil die Daten, die Sie veröffentlichen ungültig ist.

Sie könnten einen Paket-Sniffer und überprüfen Sie die genauen Daten verwenden Sie mit dem Server sind zu senden (oder cURL verwenden, wie von @acrosman vorgeschlagen)

+1

Der Typ hat nur die echte URL entfernt und eine falsche URL eingegeben, damit niemand darauf zugreifen kann. "apitestserver.co.uk" sollte klar genug gewesen sein;) – FWH

+0

yeah apitestserver ist ein Falsie, da das Original privat ist und hinter einer Firewall verriegelt ist, so dass niemand es sehen könnte! Aber ich kann vom Server aus gut darauf zugreifen, wie mein Update sagt. –

+0

Ja gut erkannt, das ist, weil ich nicht die richtigen Daten an die API sende. Ich werde meinen Haupt-Thread mit den Fehlern aus dem Hauptskript aktualisieren. –

1

apitestserver.co.uk nicht ping und die URL reagiert ist nicht erreichbar. Der API-Server scheint nicht aktiv zu sein.

+0

Es ist ein geschlossener Testserver, Sie können nicht darauf zugreifen, ohne dass die Firewall Sie durchlässt. Was es nicht tut, aber es ist auch ein geschlossener Server so könnten Sie Verweis auf es bitte löschen :) Ich dachte, ich hatte alle Instanzen im ursprünglichen Post ersetzt DOH –

+0

Hinweis Ich kann es gut zugreifen, und ich kann auch mit einem einfachen Skript zugreifen Das öffnet, liest und druckt das XML, das die API als Standard zurückgibt. –

0

Erste Fehlermeldung schlägt Probleme mit apitestserver vor - es gibt Fehlercode 500 zurück, der für "Interner Serverfehler" angibt.

Zweitens informiert, dass PHP Host-Namen nicht in IP-Adresse auflösen kann - ich würde in DNS-Konfiguration und/oder Hosts-Datei suchen.


Scheinbar 'fopen' Funktion gibt keinen richtigen Strom zurück.Es kann viele Möglichkeiten geben, wenn das passiert, aber laut PHP-Handbuch sollte die fopen-Funktion bei fehlgeschlagener E_WARNING-Meldung mit korrektem Kommentar angezeigt werden. Es ist möglich, dass Sie Fehler dieser Klasse zum Schweigen gebracht haben - rufen Sie zu Beginn Ihres Skripts error_reporting (E_ALL) auf und suchen Sie nach relevanten Fehlermeldungen.

0

oder Sie können die Header ändern:

schlage ich würde
$optional_headers = 'Content-Type: application/json') 
Verwandte Themen