Неблокирующие HTTP-запросы в объектно-ориентированном PHP?

У меня есть клиентское приложение PHP, которое взаимодействует с сервером RESTful. Каждый экземпляр PHP Goat на клиенте должен инициализировать себя на основе информации в запросе / козе на сервере (например, / goat / 35, / goat / 36 и т. Д.). Он делает это, отправив HTTP-запрос на соответствующий URL-адрес через cURL. Работа с 30 + козьими объектами на одну страницу загружается в соответствии с 30 + HTTP-запросами, и каждый из них занимает 0,25 секунды – это baaaad, как сказали бы мои козы. Ленивая загрузка и кэширование ответов в памяти помогает, но недостаточно.

foreach ($goats as $goat) { $goat->getName() // goat needs to hit the REST API } 

Преимущество этого метода заключается в том, что мои козы все умны и инкапсулированы. Недостатком является то, что производительность ужасна. Козы не знают, как ставить в очередь свои HTTP-запросы, один козел не знает, есть ли другие козы, которые должны инициировать запрос и т. Д. Я предполагаю, что одним из альтернатив было бы создание коз извне:

 $urls = array('http://', 'http://', ...); // array of goat URLs $result = fancy_pipelined_http_request_queue($urls); foreach ($result as $xml) { $goat->buildSelfFromXML($xml); } 

Я уверен, что это хорошо известная дилемма OO / REST, что есть более продвинутые способы решения, я просто не знаю, где искать. Есть идеи?

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

См. Функции socket_set_blocking / stream_set_blocking .