public function executeRequests(array $requests) { set_time_limit(Settings::TIMEOUT_LIMIT_IN_SECONDS); ini_set('memory_limit', Settings::MEMORY_LIMIT); $this->resetFileHandles(); $pool = new Pool($this->client, $requests, ['complete' => function (CompleteEvent $event) { $this->saveResponseToFile($event->getResponse()); }, 'pool_size' => Settings::NB_OF_PARALLEL_REQUESTS]); $pool->wait(); return $this->fileHandles; }
/** * @issue https://github.com/guzzle/guzzle/issues/867 */ public function testDoesNotFailInEventSystemForNetworkError() { $c = new Client(); $r = $c->createRequest('GET', Server::$url, ['timeout' => 1, 'connect_timeout' => 1, 'proxy' => 'http://127.0.0.1:123/foo']); $events = []; $fn = function (AbstractTransferEvent $event) use(&$events) { $events[] = [get_class($event), $event->hasResponse(), $event->getResponse()]; }; $pool = new Pool($c, [$r], ['error' => $fn, 'end' => $fn]); $pool->wait(); $this->assertCount(2, $events); $this->assertEquals('GuzzleHttp\\Event\\ErrorEvent', $events[0][0]); $this->assertFalse($events[0][1]); $this->assertNull($events[0][2]); $this->assertEquals('GuzzleHttp\\Event\\EndEvent', $events[1][0]); $this->assertFalse($events[1][1]); $this->assertNull($events[1][2]); }
public static function prepare(Event $event) { $composer = $event->getComposer(); $io = $event->getIO(); // TODO: Remove this hack when composer supports loading autoload.files for plugins $vendorDir = $composer->getConfig()->get('vendor-dir'); $composerDir = $vendorDir . '/composer'; $includeFiles = (require $composerDir . '/autoload_files.php'); foreach ($includeFiles as $file) { require $file; } // End of hack /** @var \Composer\Package\Package $package */ $package = $composer->getPackage(); $dependencies = []; $requires = $package->getRequires(); /** @var \Composer\Package\Link $require */ foreach ($requires as $require) { $dependencies[$require->getTarget()] = $require->getPrettyConstraint(); } $devRequires = $package->getDevRequires(); /** @var \Composer\Package\Link $require */ foreach ($devRequires as $devRequire) { $dependencies[$devRequire->getTarget()] = $devRequire->getPrettyConstraint(); } $extra = $package->getExtra(); $proxyUrls = isset($extra['composer-proxy']['url']) ? $extra['composer-proxy']['url'] : null; if (!$proxyUrls) { $io->write('<warning>No composer proxy url defined in composer.json. You might not use your proxy when fetching packages.</warning>'); return; } $io->write('<info>Sending data over to the defined proxies in order to cache your packages. Please wait, this may take a while...</info>'); $client = new GuzzleClient(); $requests = []; foreach ($proxyUrls as $proxyUrl) { $requests[] = $client->createRequest('POST', $proxyUrl . '/packages', ['body' => $dependencies]); } $pool = new Pool($client, $requests); $res = $pool->wait(); $io->write('<info>Proxies caching completed!</info>'); }
/** * Sends all of the requests concurrently and fulfills the promises */ public function sendAll() { $pool = new Pool($this->client, $this->requests, ['pool_size' => 20]); $pool->wait(); $this->requests = []; }
public function testDoesNotInfinitelyRecurse() { $client = new Client(['handler' => function () { throw new \RuntimeException('No network access'); }]); $last = null; $client->getEmitter()->on('before', function (BeforeEvent $e) use(&$last) { $e->intercept(new Response(200)); if (function_exists('xdebug_get_stack_depth')) { if ($last) { $this->assertEquals($last, xdebug_get_stack_depth()); } else { $last = xdebug_get_stack_depth(); } } }); $requests = []; for ($i = 0; $i < 100; $i++) { $requests[] = $client->createRequest('GET', 'http://foo.com'); } $pool = new Pool($client, $requests); $pool->wait(); }
public function testEmitsProgress() { $client = new Client(['handler' => function () { throw new \RuntimeException('No network access'); }]); $responses = [new Response(200), new Response(404)]; $client->getEmitter()->attach(new Mock($responses)); $requests = [$client->createRequest('GET', 'http://foo.com/baz'), $client->createRequest('HEAD', 'http://httpbin.org/get')]; $pool = new Pool($client, $requests); $count = 0; $thenned = null; $pool->then(function ($value) use(&$thenned) { $thenned = $value; }, null, function ($result) use(&$count, $requests) { $this->assertSame($requests[$count], $result['request']); if ($count == 0) { $this->assertNull($result['error']); $this->assertEquals(200, $result['response']->getStatusCode()); } else { $this->assertInstanceOf('GuzzleHttp\\Exception\\ClientException', $result['error']); } $count++; }); $pool->wait(); $this->assertEquals(2, $count); $this->assertEquals(true, $thenned); }
public function __destruct() { flush(); if (!empty($this->delayedRequests)) { $pool = new Pool($this->client, $this->delayedRequests, ['pool_size' => count($this->delayedRequests), 'complete' => ['fn' => function (CompleteEvent $event) { $this->logger->debug('Delayed request to QBank sent. ' . strtoupper($event->getRequest()->getMethod()) . ' ' . $event->getRequest()->getPath(), ['endpoint' => $event->getRequest()->getPath(), 'parameters' => $event->getRequest()->getBody() instanceof PostBodyInterface ? $event->getRequest()->getBody()->getFields() : [], 'method' => $event->getRequest()->getMethod(), 'response' => $event->hasResponse() ? substr($event->getResponse()->getBody(), 0, 4096) : '']); }, 'once' => true], 'error' => ['fn' => function (ErrorEvent $event) { $this->logger->warning('Error while sending delayed request to QBank: ' . $event->getException()->getMessage(), ['endpoint' => $event->getRequest()->getPath(), 'parameters' => $event->getRequest()->getBody() instanceof PostBodyInterface ? $event->getRequest()->getBody()->getFields() : [], 'method' => $event->getRequest()->getMethod(), 'response' => $event->hasResponse() ? substr($event->getResponse()->getBody(), 0, 4096) : '']); }, 'once' => true]]); $pool->wait(); } }
<?php include dirname(__DIR__) . '/vendor/autoload.php'; use Firebase\Firebase; use GuzzleHttp\Pool; $fb = Firebase::initialize($argv[2], $argv[1]); $requests = $fb->batch(function ($fb) { /** @var Firebase $fb */ for ($i = 0; $i < 100; $i++) { $fb->push('list', $i); } }); //pooling the requests and executing async $pool = new Pool($fb->getClient(), $requests); $pool->wait(); //the pool accepts an optional array as third argument //for more info have a look at: http://docs.guzzlephp.org/en/latest/clients.html?highlight=pool
public function test_integration_SwitchIdentities() { /* * Scenario: * 4 requests, 1 proxy with 2 identities * Identies are switched after 2 requests * In the end, * both identies should have made 2 requests * No retries take place */ $client = new Client(); $identity0 = new Identity("0"); $identity1 = new Identity("1"); $identities = [0 => $identity0, 1 => $identity1]; $identityOrder = [0, 1]; $expectedIdentities = [0, 0, 1, 1]; /** @var RandomizerInterface|PHPUnit_Framework_MockObject_MockObject $randomizer */ $randomizer = $this->getMock(RandomizerInterface::class); $getKeysFn = function ($arr) use(&$identityOrder) { return array_shift($identityOrder); }; $randomizer->expects($this->any())->method("randKey")->willReturnCallback($getKeysFn); $counter = new RandomCounterInterval(2, 2); // will always return 2; $proxy0 = new RotatingIdentityProxy($identities, "0", $randomizer, $counter); $proxies = [0 => $proxy0]; $success = true; $responses2Proxy = [[$success, $proxy0], [$success, $proxy0], [$success, $proxy0], [$success, $proxy0]]; $randKeys = []; $responses = []; foreach ($responses2Proxy as $key => $val) { $randKeys[$key] = array_search($val[1], $proxies); $responses[$key] = $val[0] ? new Response(200) : new Response(403); } $h = $this->getHelper(null, null, $randKeys); $useOwnIp = false; $rotator = new ProxyRotator($proxies, $useOwnIp, $h->getRandomMock()); $sub = new RotatingProxySubscriber($rotator); $mock = new Mock($responses); // Add the mock subscriber to the client. $client->getEmitter()->attach($mock); $client->getEmitter()->attach($sub); // build requests - we need to do this _after_ the $mock hast been attached to the client, // otherwise a real request is sent. $requests = []; foreach ($responses as $key => $val) { $req = $client->createRequest("GET"); $req->getConfig()->set("request_id", $key); $requests[$key] = $req; } $actualIdentities = []; $options = ["pool_size" => 1, "end" => function (EndEvent $ev) use(&$actualIdentities) { $actual = $ev->getRequest()->getHeader("user-agent"); $actualIdentities[] = $actual; }]; $pool = new Pool($client, $requests, $options); $pool->wait(); $this->assertEquals($expectedIdentities, $actualIdentities); }