宇宙学家/proxy-manager-bundle

代理管理器捆绑包

dev-master 2015-04-13 13:39 UTC

This package is auto-updated.

Last update: 2024-08-27 23:38:55 UTC


README

用于控制代理服务器使用的管理器。

管理器可以确保每次使用代理之间的延迟,并跟踪不再工作的服务器。

管理器可以作为常规库或作为 Symfony 的捆绑包使用。

安装

要安装,请使用 composer

composer require "cosmologist/proxy-manager-bundle" "dev-master"

简单使用示例

// Список серверов
$proxies = [
	'1.1.1.1:80',
    '2.2.2.2:8080'
];

// Сколько ждать секунд перед повторным использование прокси
$minAccessPeriod = 2;

// Через сколько неудачных попыток считаем прокси нерабочим
$maxFailedAccessCount = 2;

$proxyManager = new Cosmologist\ProxyManagerBundle\Service($proxies, $minAccessPeriod, $maxFailedAccessCount);

// Если менеджер используется в виде бандла в Symfony-приложении, то можно использовать соответствующий сервис
// $this->proxyManager = $this->getContainer()->get('cosmologist.proxy_manager');
// $this->proxyManager->setProxies($proxies);
// $this->proxyManager->setMinAccessPeriod($minAccessPeriod);
// $this->proxyManager->setMaxFailedAccessCount($maxFailedAccessCount);

try {
	$proxy = $proxyManager->getProxy();
    
    // Получаем адрес прокси-сервера
    $proxyAddress = $proxy->getAddress();
    
    // Что-то делаем через прокси, к примеру, скачиваем страницу
    ...
    
    // Если результат скачивания неудачный, фиксируем, что для данного прокси была неудачная попытка
    $proxy->increaseFailedAttemptsCount();
    
    
} catch (ProxiesEndedException $e) {
	echo 'Нет доступных для использования прокси-серверов';
}

使用代理服务器列表多线程下载网站的示例

如果您需要从特定网站下载大量文件或页面,请准备好资源管理员可能会阻止访问,特别是在大量请求或从同一 IP 地址频繁请求时。为了绕过这些阻止,ProxyManagerBundle 非常有用,它允许以指定的时间间隔通过每个代理服务器访问资源,并跟踪停止工作的代理。为了加快下载速度,我们将使用多个流进行下载,为此可以使用流行的库 Guzzle

$guzzle = new GuzzleHttp\Client();

// Список серверов
$proxies = [
	'1.1.1.1:80',
    '2.2.2.2:8080'
];

$proxyManager = new Cosmologist\ProxyManagerBundle\Service($proxies);

// Нельзя использовать переменную c именем $this в блоке use анонимной функции
$that = $this;

// Настройки пула для Guzzle
$options = [
    'before' => function (BeforeEvent $event) use ($proxyManager) {

        $proxy = $proxyManager->getProxy()->getAddress();
        $event->getRequest()->getConfig()->set('proxy', $proxy);

        echo sprintf("Set proxy %s for %s\n", $proxy, $event->getRequest()->getUrl());
    },
    'complete' => function (CompleteEvent $event) use ($that) {
        echo 'Completed request to ' . $event->getRequest()->getUrl() . "\n";

        $that->parsePage($event->getResponse());
    },
    'error' => function (ErrorEvent $event) use ($proxyManager) {
        $proxyAddress = $event->getRequest()->getConfig()->get('proxy');
        if ($proxy = $proxyManager->findProxyByAddress($proxyAddress)) {
            $proxy->increaseFailedAttemptsCount();
        }

        echo sprintf("Request failed to %s with proxy %s\n", $event->getRequest()->getUrl(), $proxyAddress);
    },
    'pool_size' => 100
];

// Формируем набор HTTP-запросов
$requests = [
    $guzzle->createRequest('GET', 'http://example.com/first.html', ['connect_timeout' => 10, 'timeout' => 20]),
    $guzzle->createRequest('GET', 'http://example.com/second.html', ['connect_timeout' => 10, 'timeout' => 20]),
    ...
    $guzzle->createRequest('GET', 'http://example.com/last.html', ['connect_timeout' => 10, 'timeout' => 20])
];

// Запускаем асинхронное скачивание
Pool::batch($guzzle, $requests, $options);