cosmologist/proxy-manager-bundle 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

cosmologist/proxy-manager-bundle

Composer 安装命令:

composer require cosmologist/proxy-manager-bundle

包简介

Proxy Manager Bundle

README 文档

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

cosmologist/proxy-manager-bundle 适用场景与选型建议

cosmologist/proxy-manager-bundle 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 104 次下载、GitHub Stars 达 1, 最近一次更新时间为 2015 年 04 月 13 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 cosmologist/proxy-manager-bundle 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 cosmologist/proxy-manager-bundle 我们能提供哪些服务?
定制开发 / 二次开发

基于 cosmologist/proxy-manager-bundle 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 104
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 1
  • 点击次数: 11
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 1
  • Watchers: 1
  • Forks: 1
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2015-04-13