2009-07-22 198 views
4

我有一個連接到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

回答

1

我會建議使用curl而不是fopen()。捲曲更靈活,更安全。許多服務器禁用allow_url_fopen,當遠程服務器出現問題時,curl也會失敗得更加正常。

1

我只是測試在我的瀏覽器中的URL,並得到一個連接錯誤。

也許問題出在他們的服務器上(或者你有錯誤的URL)?

編輯:

貌似療法服務器拋出一個500錯誤 - 也許因爲你張貼的數據是無效的。

你可以使用一個數據包嗅探器,來查看您向服務器發送的確切數據(或使用捲曲通過@acrosman的建議)

+1

這個人剛剛刪除了真實的網址,並放置了一個假的網址,所以沒有人會訪問它。 「apitestserver.co.uk」應該已經足夠清晰;) – FWH 2009-07-22 13:18:42

+0

是啊apitestserver是一個真正的原始的私人和鎖在防火牆後面,所以沒有人能夠看到它!但我可以從服務器上訪問它,正如我的更新所述。 – 2009-07-22 13:37:40

1

apitestserver.co.uk不響應ping和網址是無法訪問的。 API服務器似乎沒有啓動。

0

第一條錯誤消息提示apitestserver存在問題 - 它返回錯誤代碼500,其中指出「內部服務器錯誤」。

第二個通知PHP無法將主機名解析爲IP地址 - 我會研究DNS配置和/或主機文件。


顯然'fopen'函數沒有返回正確的流。發生這種情況時可能會有很多種可能性,但根據PHP手冊,fopen函數在失敗時應該提供E_WARNING消息並提供適當的註釋。您可能會遇到該類的錯誤消息 - 在腳本開始處調用error_reporting(E_ALL)並查找一些相關的錯誤消息。

0

或者您可以更改標題:

$optional_headers = 'Content-Type: application/json') 
相關問題