При работе с 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.