Предисловие
В рамках традиционной архитектуры PHP SNMP нас всегда беспокоили некоторые проблемы. Поскольку PHP-программы могут выполняться только последовательно, в приложениях с интенсивным вводом-выводом PHP-программы могут выполнять следующий код только после завершения операции ввода-вывода, большинство из которых ожидают ввода-вывода, что серьезно влияет на эффективность выполнения. Это очень неразумно. Теперь существует сценарий, в котором интерфейсу необходимо вызвать 10 сторонних HTTP-интерфейсов, чтобы получить все данные. Предполагая, что каждый вызов интерфейса занимает в среднем 300 мс, для завершения в традиционном последовательном режиме PHP требуется 3 секунды. Эта проблема может быть решена с помощью протокола Httpclient на основе Вулфа для реализации одновременного вызова Http-запросов.
практика
Давайте использовать следующий Традиционный HttpClient
и Клиент совместной работы Swool
Сравнивая общее время отклика запросов, преимущества одновременного вызова можно интуитивно увидеть с помощью N последовательных запросов на домашнюю страницу Taobao.
Пример традиционного Http-клиента
$start = microtime(true); $n = 50; for ($i = 0; $i < $n; $i++) { $http = new Http(); $res = $http->get('https://www.taobao.com/'); $res->getBody()->getContents(); } $end = microtime(true); echo bcsub($end,$start,2).PHP_EOL;
Пример Http-Клиента Swool Для Совместной Обработки
go(function (){ $start = microtime(true); // Concurrent request n $result = []; $clients = []; $n = 50; for ($i = 0; $i < $n; $i++) { $cli = new \Swoole\Coroutine\Http\Client('www.taobao.com', 443,true); $cli->setHeaders([ 'Host' => "www.taobao.com", "User-Agent" => 'Chrome/49.0.2587.3', 'Accept' => 'text/html,application/xhtml+xml,application/xml', 'Accept-Encoding' => 'gzip', ]); $cli->set(['timeout' => 2]); $cli->setDefer(); $cli->get('/'); $clients[] = $cli; } for ($i = 0; $i < $n; $i++) { if (!$clients[$i]->recv()) { continue; } $result[] = $clients[$i]->body; } $end = microtime(true); echo bcsub($end,$start,2).PHP_EOL; });
Анализ данных
10 | Анализ данных | Анализ данных |
20 | Анализ данных | Анализ данных |
30 | Анализ данных | Анализ данных |
50 | Анализ данных | Анализ данных |
100 | Анализ данных | Анализ данных |
Из приведенных выше данных мы видим, что скорость кооперативного режима в несколько раз выше, чем в традиционном режиме, и по мере увеличения числа вызовов преимущество кооперативного режима в скорости становится все более очевидным, что повышает производительность асинхронного режима в сценариях с интенсивным вводом-выводом.
Графика последовательных и одновременных вызовов
резюме
Если вы, как и я, в сценарии с интенсивным вводом-выводом скорость программы достигла узкого места, независимо от того, насколько оптимизирована, скорость не была улучшена качественно, тогда вы можете попробовать режим протокола Swool, который может принести неожиданные результаты. В большинстве веб-сценариев дело не в том, что наша программа выполняется медленно, а в том, что большую часть времени мы ждем окончания ввода-вывода. Независимо от того, как оптимизировать код, улучшение не очевидно. Лучше изменить образ мышления и решить проблему асинхронного ожидания ввода-вывода с помощью совместной работы. Улучшение огромно. Я надеюсь, что эта статья поможет вам!