Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Http запросы — мы все это делаем ненормально

Anna | 16.06.2014 | нет комментариев
В плане, над которым я тружусь, мы используем большое число сторонних библиотек. Многие из них — адаптеры для разных сервисов. Что их объединяет, это то, что они работают с сетью. Json поверх http, soap поверх http, какие-то свои протоколы поверх http. Т.е. все так либо напротив применяют http. И как ни восхитительно, немного кто из них пользуется превосходствами его последней версии. Я не поленился заглянуть в википедию, прошло ровно 14 лет как была принята спецификация http 1.1. И потому я решил обратиться с призывом:
image

Да, речь пойдет о keep alive. Суть в том, что, начиная с http 1.1, заказчик и сервер могут договориться не закрывать установленное tcp-соединение позже заключения запроса, а переиспользовать его для следующих запросов. Это необходимо потому, что на установку соединения требуется время. Изредка это время огромнее, чем время самого запроса. И если все серверы теснее давным-давным-давно такую вероятность поддерживают, а все браузеры и множество других заказчиков её применяют, то у разработчиков разных библиотек для знаменитых языков программирования тут отчего-то пробел.
Разглядим примитивный код на PHP, тот, что ступенчато делает 10 запросов к одному серверу:

<?php
for ($i = 0; $i < 10; $i  = 1) {
	$ch = curl_init();
	curl_setopt_array($ch, array(
		CURLOPT_URL => "https://evernote.com/favicon.ico",
		CURLOPT_VERBOSE => True,
		CURLOPT_RETURNTRANSFER => True,
	));
	$resp = curl_exec($ch);
	curl_close($ch);
}

Это каркас 95% библиотек, обращающихся к сторонним источникам. Опция CURLOPT_VERBOSE разрешает видеть в консоли все, что делает библиотека curl во время выполнения скрипта. И самые увлекательные строчки будут повторяться все 9 запросов (помимо первого):

* Connection #0 to host evernote.com left intact
* Closing connection #0
* About to connect() to evernote.com port 443 (#0)
*   Trying 204.154.94.73...

Как видите, curl оставляет соединение позже запроса открытым, но мы его здесь же закрываем. Итог грустен: 10 запросов создают 10 соединений, скрипт выполняется не менее 17 секунд.

Это говорит о том, что сам curl знаком с http 1.1, а мы мешаем ему типично трудиться. Но поправить это дюже легко:

<?php
$ch = curl_init();
for ($i = 0; $i < 10; $i  = 1) {
	curl_setopt_array($ch, array(
		CURLOPT_URL => "https://evernote.com/favicon.ico",
		CURLOPT_VERBOSE => True,
		CURLOPT_RETURNTRANSFER => True,
	));
	$resp = curl_exec($ch);
}
curl_close($ch);

Мы легко перенесли создание и удаление дескриптора из цикла, и картина при дальнейшем запуске поменялась:

* Connection #0 to host evernote.com left intact
* Re-using existing connection! (#0) with host (nil)
* Connected to (nil) (204.154.94.73) port 443 (#0)

А время работы сократилось до 5,5 секунд. Безусловно, здесь я специально обращаюсь к статическому файлу. В реальных условиях некоторое время займет образование запроса. Плюс, если вы используете http без ssl, время соединения будет немножко поменьше. Тем не менее, непрерывные соединения в любом случае дают значительный выигрыш.

Я провел несколько экспериментов, измеряя время, нужное на 10 запросов по протоколам http и https с применением отдельных соединений и keep-alive для файлов различного размера с различными пингами до сервера. Брался наилучший итог за 5-6 измерений.

evernote.com/favicon.ico, Пинг vmk! 8,5 2,7 3,1x
yandex.st/lego/_/pDu9OWAQKB0s2J9IojKpiS_Eho.ico, Пинг

Источник: programmingmaster.ru

Оставить комментарий
БАЗА ЗНАНИЙ
СЛУЧАЙНАЯ СТАТЬЯ
СЛУЧАЙНЫЙ БЛОГ
СЛУЧАЙНЫЙ МОД
СЛУЧАЙНЫЙ СКИН
НОВЫЕ МОДЫ
НОВЫЕ СКИНЫ
НАКОПЛЕННЫЙ ОПЫТ
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB