php и постоянные соединения HTTP

Есть ли способ использовать постоянные соединения HTTP между запросами?
Я не вижу, чтобы у расширений CURL был способ создать пул соединений, который используется всеми запросами, как в других расширениях для mysql, redis, pg.

Из того, что я вижу, вы можете использовать постоянные http-соединения только внутри одного запроса.

Silviu

0

Решение

pecl_http расширение для использования PHP Libcurl и позволяет открыть постоянное TCP-соединение, которое можно использовать повторно:

$client = new http\Client('curl', $persistentHandleID);
$request = new http\Client\Request('GET', 'http://example.com/');
$client->enqueue($request);
$client->send();
$response = $client->getResponse($request);

Если другой $client запущенный на одном и том же PHP-процессе (возможно, во время другого PHP-запроса) получает доступ к одному и тому же хосту и разделяет его $persistentHandleID, он будет отправлять свои HTTP-запросы по тому же TCP-соединению, что и раньше.

TCP-соединение будет поддерживаться до тех пор, пока модуль PHP не будет выключен или пока $client посылает Connection: Close или же запрещает дальнейшее использование соединения:

$client->setOptions(['forbid_reuse' => true, … ]);
2

Другие решения

В HTTP есть концепция keep-alive и конвейерная обработка. Keep-Alive позволяет использовать одно TCP-соединение для нескольких HTTP-запросов и ответов. Это позволяет браузеру загружать веб-страницу со всеми ее ресурсами (например, изображениями, сценариями и т. Д.) По одному TCP-соединению, что позволяет избежать настройки соединения и снизить накладные расходы. CURL использует это по умолчанию, добавление Connection: keep-alive в шапку. Сервер настроен на максимальное количество запросов и как долго соединение будет оставаться открытым. Но он все еще действует в режиме запрос-ответ.

С конвейером несколько запросов можно сделать до получения ответа. Конвейерная передача широко не применяется, и для работы как клиент, так и сервер должны реализовать это. Чтобы использовать в CURL, вы должны найти библиотеку (есть некоторые), которая реализует ее для вашего клиента, и снова сервер также должен использовать ее.

Если вы не уверены, отправляет ли ваше приложение CURL заголовок keep-alive, используйте прокси-сервер http или анализатор пакетов для проверки вашего трафика.

0