Есть ли способ использовать постоянные соединения HTTP между запросами?
Я не вижу, чтобы у расширений CURL был способ создать пул соединений, который используется всеми запросами, как в других расширениях для mysql, redis, pg.
Из того, что я вижу, вы можете использовать постоянные http-соединения только внутри одного запроса.
Silviu
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, … ]);
В HTTP есть концепция keep-alive и конвейерная обработка. Keep-Alive позволяет использовать одно TCP-соединение для нескольких HTTP-запросов и ответов. Это позволяет браузеру загружать веб-страницу со всеми ее ресурсами (например, изображениями, сценариями и т. Д.) По одному TCP-соединению, что позволяет избежать настройки соединения и снизить накладные расходы. CURL использует это по умолчанию, добавление Connection: keep-alive
в шапку. Сервер настроен на максимальное количество запросов и как долго соединение будет оставаться открытым. Но он все еще действует в режиме запрос-ответ.
С конвейером несколько запросов можно сделать до получения ответа. Конвейерная передача широко не применяется, и для работы как клиент, так и сервер должны реализовать это. Чтобы использовать в CURL, вы должны найти библиотеку (есть некоторые), которая реализует ее для вашего клиента, и снова сервер также должен использовать ее.
Если вы не уверены, отправляет ли ваше приложение CURL заголовок keep-alive, используйте прокси-сервер http или анализатор пакетов для проверки вашего трафика.