| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 | <?php/** * Created by PhpStorm. * User: Jaeger <JaegerCode@gmail.com> * Date: 18/12/10 * Time: 下午6:04 */namespace Jaeger;use GuzzleHttp\Client;use Closure;use GuzzleHttp\Pool;use GuzzleHttp\Psr7\Request;class MultiRequest{    protected $client;    protected $headers = [];    protected $options = [];    protected $successCallback;    protected $errorCallback;    protected $urls = [];    protected $method;    protected $concurrency = 5;    public function __construct(Client $client)    {        $this->client = $client;        $this->headers = [            'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'        ];    }    public static function newRequest(Client $client)    {        $request = new self($client);        return $request;    }    public function withHeaders($headers)    {        $this->headers = array_merge($this->headers,$headers);        return $this;    }    public function withOptions($options)    {        $this->options = $options;        return $this;    }    public function concurrency($concurrency)    {        $this->concurrency = $concurrency;        return $this;    }    public function success(Closure $success)    {        $this->successCallback = $success;        return $this;    }    public function error(Closure $error)    {        $this->errorCallback = $error;        return $this;    }    public function urls(array $urls)    {        $this->urls = $urls;        return $this;    }    public function get()    {        $this->method = 'GET';        $this->send();    }    public function post()    {        $this->method = 'POST';        $this->send();    }    protected function send()    {        $client = $this->client;        $requests = function ($urls) use($client){            foreach ($urls as $url) {                if (is_string($url)) {                    yield new Request($this->method,$url,$this->headers);                } else {                    yield $url;                }            }        };        $pool = new Pool($client, $requests($this->urls), [            'concurrency' => $this->concurrency,            'fulfilled' => $this->successCallback,            'rejected' => $this->errorCallback,            'options' => $this->options        ]);        $promise = $pool->promise();        $promise->wait();    }}
 |