Pular para o conteúdo principal

HTTP Client Parallel

The HttpClientParallel class allows you to execute multiple HTTP requests concurrently, improving performance when making multiple independent API calls.

Features

  • Run multiple HTTP requests in parallel
  • Define success and error handlers for each request
  • Batch processing for high-volume requests
  • Based on cURL multi-handle functionality

Basic Usage

<?php
// Get an instance of the HTTP client
$httpClient = \ByJG\WebRequest\HttpClient::getInstance();

// Define default success and error handlers
$onSuccess = function ($response, $id) {
// Process the successful response
$statusCode = $response->getStatusCode();
$body = $response->getBody()->getContents();
echo "Request $id completed with status $statusCode\n";
};

$onError = function ($error, $id) {
// Handle the error
echo "Request $id failed: " . $error->getMessage() . "\n";
};

// Create the HttpClientParallel instance
$parallel = new \ByJG\WebRequest\HttpClientParallel(
$httpClient,
$onSuccess,
$onError
);

// Create requests
$request1 = \ByJG\WebRequest\Psr7\Request::getInstance(
\ByJG\Util\Uri::getInstanceFromString('http://api1.example.com')
);
$request2 = \ByJG\WebRequest\Psr7\Request::getInstance(
\ByJG\Util\Uri::getInstanceFromString('http://api2.example.com')
);
$request3 = \ByJG\WebRequest\Psr7\Request::getInstance(
\ByJG\Util\Uri::getInstanceFromString('http://api3.example.com')
);

// Add requests to the parallel client
$parallel
->addRequest($request1) // Will use default handlers
->addRequest($request2) // Will use default handlers
->addRequest($request3); // Will use default handlers

// Execute all requests in parallel
$parallel->execute();

Custom Handlers for Specific Requests

You can override the default handlers for specific requests:

<?php
// Custom handler for a specific request
$customSuccessHandler = function ($response, $id) {
// Special handling for this request
echo "Special handler for request $id\n";
};

$customErrorHandler = function ($error, $id) {
// Special error handling for this request
echo "Special error handler for request $id: " . $error->getMessage() . "\n";
};

// Add request with custom handlers
$parallel->addRequest(
$request4,
$customSuccessHandler,
$customErrorHandler
);

Getting Error Information

After execution, you can retrieve a list of errors that occurred:

<?php
$parallel->execute();

// Get errors that occurred during execution
$errors = $parallel->getErrorList();

foreach ($errors as $requestId => $error) {
echo "Error in request $requestId: " . $error->getMessage() . "\n";
}

Performance Considerations

Best Practices
  • The parallel client is most effective when making multiple independent requests
  • Each request should be able to run independently without dependencies on other requests
  • There is some overhead in setting up the parallel execution mechanism, so for small numbers of requests (1-2), it may not be significantly faster than sequential requests