5 методов асинхронных обратных вызовов с PHP cURL

При работе с PHP cURL асинхронные обратные вызовы могут стать мощным инструментом для обработки неблокирующих запросов и повышения производительности ваших приложений. В этой статье мы рассмотрим пять различных методов реализации асинхронных обратных вызовов с помощью PHP cURL, а также приведем примеры кода, демонстрирующие их использование.

Метод 1. Использование нескольких URL-адресов с обратными вызовами

$multiCurl = curl_multi_init();
$handles = [];
$callbackData = [];
$handle1 = curl_init();
curl_setopt($handle1, CURLOPT_URL, 'https://example.com/api/endpoint1');
curl_setopt($handle1, CURLOPT_RETURNTRANSFER, true);
$handles[] = $handle1;
$callbackData[$handle1] = ['endpoint' => 'endpoint1'];
$handle2 = curl_init();
curl_setopt($handle2, CURLOPT_URL, 'https://example.com/api/endpoint2');
curl_setopt($handle2, CURLOPT_RETURNTRANSFER, true);
$handles[] = $handle2;
$callbackData[$handle2] = ['endpoint' => 'endpoint2'];
// Add handles to multi-cURL
foreach ($handles as $handle) {
    curl_multi_add_handle($multiCurl, $handle);
}
do {
    $status = curl_multi_exec($multiCurl, $active);
} while ($status === CURLM_CALL_MULTI_PERFORM || $active);
// Process the completed requests
while ($info = curl_multi_info_read($multiCurl)) {
    $handle = $info['handle'];
    $data = $callbackData[$handle];
    // Handle the response asynchronously
    // ...
    curl_multi_remove_handle($multiCurl, $handle);
    curl_close($handle);
}
curl_multi_close($multiCurl);

Метод 2: использование HTTP-клиента Guzzle с промисами

use GuzzleHttp\Client;
use GuzzleHttp\Promise;
$client = new Client();
$promises = [
    'endpoint1' => $client->getAsync('https://example.com/api/endpoint1'),
    'endpoint2' => $client->getAsync('https://example.com/api/endpoint2'),
];
$results = Promise\Utils::settle($promises)->wait();
foreach ($results as $endpoint => $result) {
    // Handle the response asynchronously
    // ...
}

Метод 3: использование ReactPHP с промисами

use React\EventLoop\Factory;
use React\Promise\Promise;
$loop = Factory::create();
$promises = [
    'endpoint1' => new Promise(function ($resolve, $reject) use ($loop) {
        $client = new HttpClient($loop);
        $client->get('https://example.com/api/endpoint1')->then($resolve, $reject);
    }),
    'endpoint2' => new Promise(function ($resolve, $reject) use ($loop) {
        $client = new HttpClient($loop);
        $client->get('https://example.com/api/endpoint2')->then($resolve, $reject);
    }),
];
Promise\all($promises)->then(function ($responses) {
    foreach ($responses as $response) {
        // Handle the response asynchronously
        // ...
    }
});
$loop->run();

Метод 4. Использование HTTP-клиента Swoole

use Swoole\Coroutine;
use Swoole\Coroutine\Http\Client;
Coroutine\run(function () {
    $client = new Client('example.com', 443, true);
    $client->set(['timeout' => 5]);
    $client->get('/api/endpoint1');
    $response1 = $client->body;
    $client->get('/api/endpoint2');
    $response2 = $client->body;
    // Handle the responses asynchronously
    // ...
    $client->close();
});

Метод 5. Использование HTTP-клиента Amp с промисами

use Amp\Loop;
use Amp\Artax\Client;
use Amp\Promise;
Loop::run(function () {
    $client = new Client();
    $promises = [
        'endpoint1' => $client->request('https://example.com/api/endpoint1'),
        'endpoint2' => $client->request('https://example.com/api/endpoint2'),
    ];
    $responses = Promise\wait(Promise\all($promises));
    foreach ($responses as $response) {
        // Handle the response asynchronously
        // ...
    }
});

В этой статье мы рассмотрели пять различных методов реализации асинхронных обратных вызовов с помощью PHP cURL. В зависимости от ваших конкретных требований и доступных библиотек вы можете выбрать метод, который лучше всего соответствует вашим потребностям. Используя асинхронные обратные вызовы, вы можете повысить производительность и скорость реагирования ваших PHP-приложений, использующих запросы cURL.