Blackfire\Player\Player::runMulti PHP Метод

runMulti() публичный Метод

public runMulti ( ScenarioSet $scenarioSet, $concurrency = null ) : array
$scenarioSet ScenarioSet
Результат array
    public function runMulti(ScenarioSet $scenarioSet, $concurrency = null)
    {
        $results = [];
        $this->registerHandlers();
        $requests = [];
        foreach ($scenarioSet as $key => $scenario) {
            $valueBag = new ValueBag($scenario->getValues());
            $extraBag = new ValueBag();
            $step = $scenario->getRoot();
            $options = ['step' => $step, 'values' => $valueBag, 'extra' => $extraBag, 'http_errors' => true];
            foreach ($this->extensions as $extension) {
                $extension->preRun($scenario, $valueBag, $extraBag);
            }
            $requests[$key] = [$this->createRequest($step, $valueBag), $options, $scenario];
        }
        if (!$concurrency) {
            $concurrency = min(count($requests), count($this->clients));
        }
        $this->logger and $this->logger->debug(sprintf('Concurrency set to "%d"', $concurrency));
        if ($concurrency > count($this->clients)) {
            throw new RuntimeException('Concurrency (%d) must be less than or equal to the number of Guzzle clients (%s)', $concurrency, count($this->clients));
        }
        $fulfilled = $rejected = function ($response, $key) use(&$results, $requests) {
            $valueBag = $requests[$key][1]['values'];
            $extraBag = $requests[$key][1]['extra'];
            $scenario = $requests[$key][2];
            $exception = null;
            if ($response instanceof \Exception) {
                $exception = $response;
                $this->logger and $this->logger->error(sprintf('Scenario "%s" ended with an error: %s', $scenario->getTitle(), $exception->getMessage()));
            }
            foreach ($this->extensions as $extension) {
                $extension->postRun($scenario, $valueBag, $extraBag);
            }
            $results[$key] = new Result($valueBag, $extraBag, $exception);
        };
        $requests = function () use($requests) {
            $i = 0;
            $count = count($this->clients);
            foreach ($requests as $key => $data) {
                $client = ++$i % $count;
                $this->logger and $this->logger->info(sprintf('Starting scenario "%s" (sent to client %d)', $data[2]->getTitle(), $client));
                (yield $key => $this->clients[$client]->sendAsync($data[0], $data[1]));
                // cleanup cookies on the client
                if ($cookieJar = $this->clients[$client]->getConfig('cookies')) {
                    $cookieJar->clear();
                }
            }
        };
        (new EachPromise($requests(), ['concurrency' => $concurrency, 'fulfilled' => $fulfilled, 'rejected' => $rejected]))->promise()->wait();
        return $results;
    }

Usage Example

Пример #1
0
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $logger = new ConsoleLogger($output);
     $clients = [$this->createClient($output)];
     for ($i = 1, $concurrency = $input->getOption('concurrency'); $i < $concurrency; ++$i) {
         $clients[] = $this->createClient($output);
     }
     $player = new Player($clients);
     $player->setLogger($logger);
     if ($env = $input->getOption('blackfire')) {
         $blackfireConfig = new BlackfireClientConfiguration();
         $blackfireConfig->setEnv($env);
         $blackfire = new BlackfireClient($blackfireConfig);
         $player->addExtension(new \Blackfire\Player\Extension\BlackfireExtension($blackfire, $logger));
     }
     $variables = [];
     foreach ($input->getOption('variables') as $variable) {
         list($key, $value) = explode('=', $variable, 2);
         $variables[$key] = $value;
     }
     $loader = new YamlLoader();
     $scenarios = new ScenarioSet();
     foreach ($input->getArgument('files') as $file) {
         if (!is_file($file)) {
             throw new \InvalidArgumentException(sprintf('File "%s" does not exist.', $file));
         }
         foreach ($loader->load(file_get_contents($file)) as $reference => $scenario) {
             if ($input->getOption('endpoint')) {
                 $scenario->endpoint($input->getOption('endpoint'));
             }
             foreach ($variables as $key => $value) {
                 $scenario->value($key, $value);
             }
             $scenarios->add($scenario, $reference);
         }
     }
     $results = $player->runMulti($scenarios);
     if ($output = $input->getOption('output')) {
         $values = [];
         foreach ($results as $result) {
             $values[] = $result->getValues()->all();
         }
         file_put_contents($output, json_encode($values, JSON_PRETTY_PRINT));
     }
     // any scenario with an error?
     foreach ($results as $result) {
         if ($result->isErrored()) {
             return 1;
         }
     }
     if ($logger->hasErrored()) {
         return 1;
     }
 }