get_meta_tags () соединение отказано - PullRequest
0 голосов
/ 30 ноября 2011

В своем 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 Ответ

2 голосов
/ 30 ноября 2011

По умолчанию PHP не использует прокси.Чтобы обойти через прокси, вы можете добавить прокси для всех функций, используя http stream wrapper Docs (эта оболочка заботится о «именах файлов», начиная сhttp:// или https://), как в вашем get_meta_tags Документах Пример функции.

Существует множество HTTP-контекстаОпции Документы , то, что вы ищете, это proxy.

Поскольку get_meta_tags не принимает параметр контекста (только имя файлапараметр), вам нужно изменить так называемый контекст по умолчанию , который (обычно) используется функциями PHP, принимающими параметр имени файла.Устанавливается с stream_context_get_default Документами .

$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:// Docs .Маленькая вспомогательная функция заботится о преобразовании:

/**
 * 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);       
};

Эта функция позволяет получать содержимое из URL с file_get_contents, который использует контекст потока по умолчанию.Это тот, для которого был настроен прокси.

Затем вы можете объединить это с 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);       
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...