Implementation of an Async HTTP client using CURL.
*** NOTE *** This is a work in progress, Not 100% compatible replacement for ReactPHP Browser
Using cURL allows for HTTP/2+3, connection pooling (with keep-alive), and the extraction of timing data for the requests. This functionality is not available though the ReactPHP Browser implementation
The package is compatible with PHP 8.2+ and requires the cURL extension and react/event-loop library.
You can add the library as project dependency using Composer:
composer require edgetelemetrics/reactphp-http-browser-curl
See /examples directory. Examples based on examples from reactphp/http under MIT License
Request timing values are returned in the PSR7 Response object headers under the key Server-Timing
The Browser can be configured with standard CURLOPT_* parameters given via the constructor.
$browser = new Browser([
CURLOPT_TIMEOUT => 20,
CURLOPT_DOH_URL, 'https://1.1.1.1/dns-query',
CURLOPT_DNS_SERVERS => '1.1.1.1',
]);
Each instance of Browser shares a Connection pool, DNS cache, SSL cache, and Cookie Jar. An example of this can be seen in /examples/connection_pooling.php script.
The request/response timing is provided though the header 'ServerTiming
' in the Response object.
Each timing point is defined as <timing point>;dur=<duration in second>
- namelookup_time
- connect_time
- appconnect_time
- pretransfer_time
- redirect_time
- starttransfer_time
- total_time
Additional request/response metadata is provided though the header 'X-Connection
' in the Response object.
Key/Value pairs are as follows:
- effective_url=
<final url after any redirects>
- connection;count=
<number of connections opened during the request, 0 if existing connection reused>
- redirect;count=
<number of redirects followed>
- upload;size=
<bytes sent in request(headers+body) including redirects>
;speed=<overall bytes per second upload>
- download;size=
<bytes received in response(headers+body) including redirects>
;speed=<overall bytes per second download>
MIT, see LICENSE file.
Bug reports (and small patches) can be submitted via the issue tracker. Forking the repository and submitting a Pull Request is preferred for substantial patches.