Wallogit.com
2017 © Pedro PelΓ‘ez
Proxy Manager Bundle
ΠΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π·Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΠΊΡΠΈ-ΡΠ΅ΡΠ²Π΅ΡΠΎΠ²., (*1)
ΠΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π·Π°Π΄Π΅ΡΠΆΠΊΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡΠΎΠΊΡΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π»ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ., (*2)
ΠΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ, ΡΠ°ΠΊ ΠΈ ΠΊΠ°ΠΊ Π±Π°Π½Π΄Π» Π΄Π»Ρ Symfony., (*3)
ΠΠ»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ composer:, (*4)
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., (*5)
$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);