2011-07-13 71 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