2011-11-30 146 views
0

在我的php代碼中,我使用get_meta_tags()從網站獲取元信息。但我的代理服務器拒絕連接,我收到以下錯誤:get_meta_tags()連接被拒絕

Warning:get_meta_tags(http://www.espncricinfo.com/)[function.get-meta-tags]:未能打開流:沒有連接,因爲目標機器積極拒絕它

任何人都可以告訴我如何通過代理在我的PHP代碼?

我嘗試在Eclipse XDebug配置中設置代理,但我不認爲這是正確的方式來做到這一點。

curl我指定的代理爲curl_setopt($ch, CURLOPT_PROXY, "host:port");哪些工作正常,但在PHP中我不知道該過程。 任何幫助,將不勝感激。

-Adithya

回答

2

默認情況下PHP不使用代理。要繞過代理服務器,您可以使用http stream wrapper Docs(該包裝程序正在照顧「文件名」,以http://https://開頭)爲您的所有功能添加代理,就像您在get_meta_tagsDocs函數示例中一樣。

有很多HTTP context options Docs,你正在尋找的是proxy

由於get_meta_tags不接受上下文參數(僅一個文件名參數),您需要更改所使用的PHP函數接受一個文件名參數,該參數(一般)所謂默認情況下。它的設置爲stream_context_get_defaultDocs

$opts = array(
    'http' => array(
     'proxy' => 'tcp://127.0.0.1:8000' 
    ) 
); 
stream_context_get_default($opts); 

不幸的是get_meta_tags看起來像一個例外的一般規則在所有使用流包裝(至少我的PHP 5.3.8版本)。但不用擔心,您可以使用默認上下文將您想要獲取元標記的數據放入get_meta_tags

這可以通過data:// stream wrapperDocs完成。小助手功能,需要照顧的轉換:

/** 
* obtain $filename content as data:// URI 
* 
* @link http://php.net/manual/en/wrappers.data.php 
* 
* @param string $filename 
* @return string data:// URI 
*/ 
function filename_data_uri($filename) 
{ 
    $buffer = file_get_contents($filename); 

    $mime = 'text/plain'; 
    # obtain mime type and charset from http response (if available) 
    if (isset($http_response_header)) 
     foreach($http_response_header as $header) 
      sscanf($header, 'Content-Type: %[^]]', $mime) 
    ; 

    return "data://$mime;base64,".base64_encode($buffer);  
}; 

這個功能可以從file_get_contents的URL,這使得使用默認的流上下文得到內容。這是代理配置的那個。

然後,您可以用get_meta_tags結合本:

$url = 'http://www.espncricinfo.com/'; 
$url = filename_data_uri($url); 
$meta_tags = get_meta_tags($url); 

get_meta_tags現在經營上一直取已經與filename_data_uri功能同時使用代理的$url內容。完整的例子:

$url = 'http://www.espncricinfo.com/'; 
$proxy = 'tcp://host:port'; 

// configure default context to use proxy 
$opts['http']['proxy'] = $proxy; 
$resource = stream_context_get_default($opts); 

// obtain url contents with default context 
$data = filename_data_uri($url); 
$meta_tags = get_meta_tags($data); 
print_r($meta_tags); 

/** 
* obtain $filename content as data:// URI 
* 
* @link http://php.net/manual/en/wrappers.data.php 
* 
* @param string $filename 
* @return string data:// URI 
*/ 
function filename_data_uri($filename) 
{ 
    $buffer = file_get_contents($filename); 

    $mime = 'text/plain'; 
    # obtain mime type and charset from http response (if available) 
    if (isset($http_response_header)) 
     foreach($http_response_header as $header) 
      sscanf($header, 'Content-Type: %[^]]', $mime) 
    ; 

    return "data://$mime;base64,".base64_encode($buffer);  
}; 
+0

我試過你的代碼,但這也沒有幫助!我收到以下錯誤: 警告:file_get_contents(http://www.espncricinfo.com/)[function.file-get-contents]:無法打開流:HTTP請求失敗! HTTP/1.1 502代理錯誤(統一資源定位符(URL)不使用公認的協議。 我能夠使用curl(通過配置代理)來獲取網站內容,我試圖將它傳遞給get_meta_tags函數,但這並不起作用。我讀了get_meta_tags也接受了一個字符串,但沒有奏效。 $ buffer始終爲假。 – Adithya

+0

有沒有辦法在http頭中指定協議? – Adithya