get_meta_tags()连接被拒绝

时间:2011-11-30 07:36:48

标签: php eclipse debugging proxy

在我的PHP代码中,我使用get_meta_tags()从网站获取元信息。但我的代理服务器拒绝连接,我收到以下错误:

警告:get_meta_tags(http://www.espncricinfo.com/)[function.get-meta-tags]:无法打开流:无法建立连接,因为目标计算机主动拒绝它

任何人都可以告诉我如何在我的PHP代码中传递代理吗?

我尝试在Eclipse XDebug配置中设置代理,但我不认为这是正确的方法。

curl中,我将代理指定为curl_setopt($ch, CURLOPT_PROXY, "host:port");但工作正常但在php中我不知道该程序。 任何帮助将不胜感激。

-Adithya

1 个答案:

答案 0 :(得分:2)

默认情况下,PHP不使用代理。要绕过代理,您可以使用http stream wrapper Docs为该所有函数添加代理(该封装正在处理从http://https://开始的“文件名”),例如get_meta_tagsDocs 3}}功能示例。

有很多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获取内容,该URL使用默认流上下文。这是代理配置的那个。

然后,您可以将其与get_meta_tags

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

get_meta_tags现在对使用代理时已使用$url函数提取的filename_data_uri内容进行操作。完整的例子:

$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);       
};