Fixed missing reuse of existing http connections which are kept-alive by remote servers (e.g. dedimania).

This commit is contained in:
Sebastian Büttner 2017-05-21 17:52:56 +02:00
parent 8241abdbf2
commit 2ec6fdbed9
2 changed files with 40 additions and 22 deletions

View File

@ -3,6 +3,7 @@
namespace ManiaControl\Files; namespace ManiaControl\Files;
use cURL\Request; use cURL\Request;
use cURL\RequestsQueue;
use ManiaControl\General\UsageInformationAble; use ManiaControl\General\UsageInformationAble;
use ManiaControl\General\UsageInformationTrait; use ManiaControl\General\UsageInformationTrait;
use ManiaControl\ManiaControl; use ManiaControl\ManiaControl;
@ -27,8 +28,9 @@ class AsynchronousFileReader implements UsageInformationAble {
*/ */
/** @var ManiaControl $maniaControl */ /** @var ManiaControl $maniaControl */
private $maniaControl = null; private $maniaControl = null;
/** @var Request[] $requests */
private $requests = array(); /** @var \cURL\RequestsQueue|null $requestQueue */
private $requestQueue = null;
/** /**
* Construct a new Asynchronous File Reader Instance * Construct a new Asynchronous File Reader Instance
@ -37,19 +39,22 @@ class AsynchronousFileReader implements UsageInformationAble {
*/ */
public function __construct(ManiaControl $maniaControl) { public function __construct(ManiaControl $maniaControl) {
$this->maniaControl = $maniaControl; $this->maniaControl = $maniaControl;
$this->requestQueue = new RequestsQueue();
} }
/** /**
* Append available Data of active Requests * Append available Data of active Requests
*/ */
public function appendData() { public function appendData() {
foreach ($this->requests as $key => $request) { do {
if ($request->socketPerform()) { if (($count = $this->requestQueue->count()) == 0) {
$request->socketSelect(); break;
} else {
unset($this->requests[$key]);
} }
}
if ($this->requestQueue->socketPerform()) {
$this->requestQueue->socketSelect();
}
} while ($count != $this->requestQueue->count());
} }
/** /**
@ -91,6 +96,6 @@ class AsynchronousFileReader implements UsageInformationAble {
* @param Request $request * @param Request $request
*/ */
public function addRequest(Request $request) { public function addRequest(Request $request) {
array_push($this->requests, $request); $request->attachTo($this->requestQueue);
} }
} }

View File

@ -33,18 +33,6 @@ class Request extends EventDispatcher implements RequestInterface
$this->ch = curl_init(); $this->ch = curl_init();
} }
/**
* Closes cURL resource and frees the memory.
* It is neccessary when you make a lot of requests
* and you want to avoid fill up the memory.
*/
public function __destruct()
{
if (isset($this->ch)) {
curl_close($this->ch);
}
}
/** /**
* Get the cURL\Options instance * Get the cURL\Options instance
* Creates empty one if does not exist * Creates empty one if does not exist
@ -61,7 +49,7 @@ class Request extends EventDispatcher implements RequestInterface
/** /**
* Sets Options * Sets Options
* *
* @param Options $options Options * @param Options $options Options
* @return void * @return void
*/ */
@ -69,6 +57,17 @@ class Request extends EventDispatcher implements RequestInterface
{ {
$this->options = $options; $this->options = $options;
} }
/**
* Closes cURL resource and frees the memory.
* It is neccessary when you make a lot of requests
* and you want to avoid fill up the memory.
*/
public function __destruct() {
if (isset($this->ch)) {
curl_close($this->ch);
}
}
/** /**
* Returns cURL raw resource * Returns cURL raw resource
@ -116,6 +115,20 @@ class Request extends EventDispatcher implements RequestInterface
return $response; return $response;
} }
/**
* Binds the request to a given RequestQueue.
*
* @param \cURL\RequestsQueue $requestsQueue
* @throws \cURL\Exception
*/
public function attachTo(RequestsQueue $requestsQueue) {
if (isset($this->queue)) {
throw new Exception('Already bound to a RequestQueue.');
}
$this->queue = $requestsQueue;
$this->queue->attach($this);
}
/** /**
* Creates new RequestsQueue with single Request attached to it * Creates new RequestsQueue with single Request attached to it
* and calls RequestsQueue::socketPerform() method. * and calls RequestsQueue::socketPerform() method.