2011-07-13 75 views
3

這已解決 - 請參閱回答在這個帖子收到錯誤代碼28捲曲

THE END我試圖檢索使用PHP /從遠程服務器數據捲曲

如果我把跟着URL到瀏覽器的數據正確返回。

http://realm103.c7.castle.wonderhill.com/api/map.json?user%5Fid=5245274&x=375&y=375&timestamp=1310554325&%5Fsession%5Fid=5b2070a46a083a33e053d60dbc2d062e&dragon%5Fheart=098d2deb0a37f18c97428d636c456572f9bade24&version=3

然而,當我試圖/訪問,如果用PHP捲曲它只是超時(錯誤代碼28)。

$json = curl($jsonurl, $realm['intRealmID'], $realm['strRealmServer']); 

function curl($url, $realm, $realmServer){ 
$header = array(); 
$header[] = 'Host: realm'.strval($realm).'.'.$realmServer.'.castle.wonderhill.com'; 
$header[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'; 
$header[] = 'Accept-Language: en-us,en;q=0.5'; 
$header[] = 'Accept-Encoding: gzip,deflate'; 
$header[] = 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7'; 
$header[] = 'Connection: keep-alive'; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0'); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 
curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_ENCODING, ''); 
curl_setopt($ch, CURLOPT_TIMEOUT, 20); 
return curl_exec($ch); 
curl_close($ch); 

}

任何人有任何想法,爲什麼它從瀏覽器的工作原理,但不是通過捲曲?謝謝

補充信息 雖然cURL不適用於上述URL。對於下面的URL,它工作得很好。唯一的區別是數據被請求的服務器。數據本身和POST是相同的。

http://realm4.c5.castle.wonderhill.com/api/map.json?user%5Fid=1053774&x=375&y=375&timestamp=1310616808&%5Fsession%5Fid=5b2070a46a083a33e053d60dbc2d062e&dragon%5Fheart=f35f476facab91f0e901eaf2209a0c8a9b9bedcc&version=3

ANSWER

最後回到這個發現引薦是問題。服務器期望在請求頭中看不到引用者。當它的請求被阻止。那時候所有服務器的行爲可能都不一致,但現在是這樣。從請求標題中刪除引用來源並保留其他所有內容現在都可以使用。

+0

是否有任何原因導致用戶ID在2個URL中不同?這是因爲你有每個服務器1?這是不尋常的,因爲用戶ID通常在單個服務中是通用的 – Ryan

+1

找到引用者是問題。我已經更新了OP。 – runey71

回答

1

您的cURL函數與直接請求信息的最大區別是CURLOPT_HEADER屬性,我首先會嘗試從代碼中刪除此項。

+0

作爲一個方面,請嘗試刪除'CURLOPT_USERAGENT',它不應該是一個大問題,但我會刪除它,除非絕對需要。 – Ryan

+0

我試着刪除'CURLOPT_HTTPHEADER'和'CURLOPT_USERAGENT',但仍然沒有快樂。嘗試繼續超時。 – runey71

+0

發現引用者是這個問題。我已經更新了OP。再次感謝您的幫助:) – runey71

1

試試這個

function get_data($url) 
{ 
    $ch = curl_init(); 
    $timeout = 5; 
    curl_setopt($ch,CURLOPT_URL,$url); 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout); 
    $data = curl_exec($ch); 
    curl_close($ch); 
    return $data; 
} 

$returned_content = get_data('your url'); 

或者,您可以遠程使用file_get_contents功能,但很多主機不允許這種

$userAgent = ‘Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0’; 
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent); 

一些其他選項我使用:

curl_setopt($ch, CURLOPT_FAILONERROR, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
curl_setopt($ch, CURLOPT_TIMEOUT, 10); 

試試這個:

$ctx = stream_context_create(array(
       'socket' => array(
          'bindto' => '192.168.0.107:0', 
    ) 
    )); 

    $c= file_get_contents('http://php.net', 0, $ctx); 
+0

謝謝您的提示。我現在正在測試各種cURL選項。 'file_get_contents'不起作用。 我在原始問題中增加了一些額外的信息。由於cURL可以爲一個URL工作,但不適用於發佈的原始URL。但它們實際上是相同的。唯一的例外是遠程服務器。 – runey71

+0

剛剛嘗試了額外的cURL選項,仍然沒有運氣:( – runey71

+0

你使用了bindto嗎? – jeni