Вход Регистрация
Файл: monst/Xsolla/Guzzle/Batch/BatchCommandTransfer.php
Строк: 99
<?php

namespace GuzzleBatch;

use 
GuzzleBatchBatchTransferInterface;
use 
GuzzleBatchBatchDivisorInterface;
use 
GuzzleCommonExceptionInvalidArgumentException;
use 
GuzzleServiceCommandCommandInterface;
use 
GuzzleServiceExceptionInconsistentClientTransferException;

/**
 * Efficiently transfers multiple commands in parallel per client
 * This class is to be used with {@see GuzzleBatchBatchInterface}
 */
class BatchCommandTransfer implements BatchTransferInterfaceBatchDivisorInterface
{
    
/** @var int Size of each command batch */
    
protected $batchSize;

    
/**
     * @param int $batchSize Size of each batch
     */
    
public function __construct($batchSize 50)
    {
        
$this->batchSize $batchSize;
    }

    
/**
     * Creates batches by grouping commands by their associated client
     * {@inheritdoc}
     */
    
public function createBatches(SplQueue $queue)
    {
        
$groups = new SplObjectStorage();
        foreach (
$queue as $item) {
            if (!
$item instanceof CommandInterface) {
                throw new 
InvalidArgumentException('All items must implement GuzzleServiceCommandCommandInterface');
            }
            
$client $item->getClient();
            if (!
$groups->contains($client)) {
                
$groups->attach($client, new ArrayObject(array($item)));
            } else {
                
$groups[$client]->append($item);
            }
        }

        
$batches = array();
        foreach (
$groups as $batch) {
            
$batches array_merge($batchesarray_chunk($groups[$batch]->getArrayCopy(), $this->batchSize));
        }

        return 
$batches;
    }

    public function 
transfer(array $batch)
    {
        if (empty(
$batch)) {
            return;
        }

        
// Get the client of the first found command
        
$client reset($batch)->getClient();

        
// Keep a list of all commands with invalid clients
        
$invalid array_filter($batch, function ($command) use ($client) {
            return 
$command->getClient() !== $client;
        });

        if (!empty(
$invalid)) {
            throw new 
InconsistentClientTransferException($invalid);
        }

        
$client->execute($batch);
    }
}
Онлайн: 1
Реклама