Search by

webservco / http-client

ariademur

A PHP component/library. PSR-18 HTTP client built on cURL, plus a client that sends several requests in parallel.

Package info

github.com/webservco/http-client

Homepage

pkg:composer/webservco/http-client

Statistics

Installs: 377

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v2.3.0 2026-10-11 16:34 UTC

README

A PHP component/library. Please see webservco/sandbox for an example project using these types of components.

PSR-18 HTTP client built on cURL, plus a client that sends several requests in parallel.

  • Implements: PSR-18: HTTP Client
  • Provides: psr/http-client-implementation
  • Requires: ext-curl, a PSR-17 implementation such as webservco/http
  • Related: webservco/http-client-test (tests, kept separate to avoid extra dependencies here)

Installation

composer require webservco/http-client

Usage

Create the cURL service

Every client needs it. This factory uses the webservco/http factories:

use WebServCo\Http\Client\DataTransfer\CurlServiceConfiguration;
use WebServCo\Http\Client\Service\cURL\CurlService;
use WebServCo\Http\Factory\Message\Response\ResponseFactory;
use WebServCo\Http\Factory\Message\Stream\StreamFactory;
use WebServCo\Http\Service\Message\Response\StatusCodeService;
use WebServCo\Log\Factory\ContextFileLoggerFactory;

$streamFactory = new StreamFactory();

// \WebServCo\Http\Client\Contract\Service\cURL\CurlServiceInterface
$curlService = new CurlService(
    // Debug mode (logs requests and responses), timeout in seconds.
    new CurlServiceConfiguration(true, 30),
    // \WebServCo\Log\Contract\LoggerFactoryInterface
    new ContextFileLoggerFactory(sprintf('%svar/log', $projectPath)),
    // PSR-17: \Psr\Http\Message\ResponseFactoryInterface
    new ResponseFactory(new StatusCodeService(), $streamFactory),
    // PSR-17: \Psr\Http\Message\StreamFactoryInterface
    $streamFactory,
);

Send a request

use WebServCo\Http\Client\Service\PSR18\HttpClient;

// PSR-18: \Psr\Http\Client\ClientInterface
$httpClient = new HttpClient($curlService);
// PSR-7: \Psr\Http\Message\ResponseInterface
$response = $httpClient->sendRequest($request);

Send requests in parallel

use WebServCo\Http\Client\Service\cURL\CurlMultiService;

// \WebServCo\Http\Client\Contract\Service\cURL\CurlMultiServiceInterface
$curlMultiService = new CurlMultiService($curlService);

// Keep the handle identifier for each request, to find its response later.
$handleIdentifiers = [];
foreach ($requests as $requestId => $request) {
    $handleIdentifiers[$requestId] = $curlMultiService->createHandle($request);
}

$curlMultiService->executeSessions();

foreach ($handleIdentifiers as $requestId => $handleIdentifier) {
    $response = $curlMultiService->getResponse($handleIdentifier);
}
// Or, when you don't need to match them: foreach ($curlMultiService->iterateResponse() as $response) {}

// Clean up before reusing the service.
$curlMultiService->reset();

Contracts

Interface Implementation Purpose
\Psr\Http\Client\ClientInterface Service\PSR18\HttpClient Sends one request.
Contract\Service\cURL\CurlMultiServiceInterface Service\cURL\CurlMultiService Sends many requests at once with curl_multi.
Contract\Service\cURL\CurlServiceInterface Service\cURL\CurlService Creates cURL handles and turns results into PSR-7 responses.
none DataTransfer\CurlServiceConfiguration Debug mode and timeout.

Namespaces are relative to WebServCo\Http\Client\.

Notes

The timeout applies to both connecting and the whole transfer. With debug mode on, every request and response is logged through the logger factory. Turn it off in production unless you're tracking down a problem.

The parallel client takes PSR-7 requests and returns PSR-7 responses, but its own interface isn't part of PSR-18.

Development

# Start project.
ddev start
# Install dependencies.
ddev c u
# Run all validations.
ddev c c
# Run unit tests.
ddev c test:dox

License

MIT