Думаю, для асинхронности тут нужны сторонние решения. Например отличный Guzzle - Concurrent requests
Guzzleuse GuzzleHttp\Client;
use GuzzleHttp\Promise;
$client = new Client(['base_uri' => 'http://httpbin.org/']);
$promises = [
'image' => $client->getAsync('/image'),
'png' => $client->getAsync('/image/png'),
'jpeg' => $client->getAsync('/image/jpeg'),
'webp' => $client->getAsync('/image/webp')
];
// когда все запросы завершатся
// если в одном из запросов ошибка
$results = Promise\unwrap($promises);
// когда все запросы завершатся , даже если были ошибки
$results = Promise\settle($promises)->wait();
// можно получить доступ к любому результату
// function.
echo $results['image']['value']->getHeader('Content-Length')[0]
echo $results['png']['value']->getHeader('Content-Length')[0]