默認情況下PHP不使用代理。要繞過代理服務器,您可以使用http stream wrapper Docs(該包裝程序正在照顧「文件名」,以http://
或https://
開頭)爲您的所有功能添加代理,就像您在get_meta_tags
Docs函數示例中一樣。
有很多HTTP context options Docs,你正在尋找的是proxy
。
由於get_meta_tags
不接受上下文參數(僅一個文件名參數),您需要更改所使用的PHP函數接受一個文件名參數,該參數(一般)所謂默認情況下。它的設置爲stream_context_get_default
Docs。
$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);
};
我試過你的代碼,但這也沒有幫助!我收到以下錯誤: 警告: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
有沒有辦法在http頭中指定協議? – Adithya