Как мы все знаем, curl не рекомендуется использовать в приложениях swool, поскольку curl блокирует процессы.
В этой статье мы будем использовать фактический код и данные наиболее интуитивно понятным способом, чтобы вы поняли, почему.
Наконец, будет дано решение curl в swool. Если вы не хотите видеть анализ, вы можете довести его до конца.
Рутинное сравнение
Юруну не нравятся виртуальные в статье, поэтому более реалистично писать самому. Запустите код напрямую и используйте данные, чтобы понять, почему curl не рекомендуется использовать в swool.
Чтобы быть ленивым, я напрямую использовал обработчик завитков и свулов yurunhttp для замены этих вонючих и длинных фигурных кодов.
Код
Код
{
"require": {
"yurunsoft/yurun-http": "~3.0"
}
}сервер. php
on('workerstart', function(){
\Swoole\Runtime::enableCoroutine();
});
$http->on('request', function ($request, $response) {
Sleep (1); // suppose that each processing takes 1 second
$response->end($request->get['id'] . ': ' . date('Y-m-d H:i:s'));
});
$http->start();php
get ('http: // 127.0.0.1:9501 /? Id = '. $I); // request address
var_dump($response->body());
$channel->push(1);
});
}
for($i = 0; $i < REQUEST_COUNT; ++$i)
{
$channel->pop();
}
$channel->close();
echo 'coroutine http client time: ', (microtime(true) - $time) . 's', PHP_EOL, PHP_EOL;
// curl
echo 'curl:', PHP_EOL, PHP_EOL;
$time = microtime(true);
Yurunhttp:: setdefaulthandler (\ Yurun \ util \ yurunhttp \ handler \ curl:: class); // switch to curl handler
$channel = new \Swoole\Coroutine\Channel;
for($i = 0; $i < REQUEST_COUNT; ++$i)
{
go(function() use($channel, $i){
$http = new HttpRequest;
$response = $HTTP - > get ('http: // 127.0.0.1:9501 /? Id = '. $I); // request address
var_dump($response->body());
$channel->push(1);
});
}
for($i = 0; $i < REQUEST_COUNT; ++$i)
{
$channel->pop();
}
$channel->close();
echo 'curl time: ', (microtime(true) - $time) . 's', PHP_EOL, PHP_EOL;
});Функция
Необходимо выполнить первый запуск обновление композитора Зависимость от установки
- Функция
php server.php, запустите сервер - Функция
php test.php, запустите клиент
Результат операции
coroutine http client: string(22) "1: 2019-09-11 08:35:54" string(22) "0: 2019-09-11 08:35:54" string(22) "2: 2019-09-11 08:35:54" coroutine http client time: 1.0845630168915s curl: string(22) "0: 2019-09-11 08:35:55" string(22) "1: 2019-09-11 08:35:56" string(22) "2: 2019-09-11 08:35:57" curl time: 3.0139901638031s
Анализ результатов
Приведенный выше код возвращает результат после задержки сервера на 1 секунду, имитируя фактическое рабочее время.
Из временных затрат клиента видно, что общее время, затрачиваемое на три запроса curl, составляет более 3 секунд, в то время как у клиента сотрудничества-всего более 1 секунды.
Потому что в предыдущем запросе curl не мог сделать ничего другого, ожидая возврата содержимого. Пока клиент процесса ожидает возврата содержимого, он приостанавливает текущий процесс и выполняет код в других процессах.
Решение
Сопрограмма HttpClient
Используя встроенный кооперативный клиент swool, он подходит для разработчиков с определенным фундаментом.
Документ: https://wiki.swoole.com/wiki/
Жрать-Свул
В проекте мы редко можем писать curl напрямую, но многие сторонние библиотеки классов (такие как SDK какого-либо облака), которые мы используем, будут полезны.
Эти сторонние библиотеки обычно используют guzzle в качестве HTTP-клиента, и базовый guzzle также реализован с использованием curl.
Юрун специально разработал пакет “жрут свул” для этого сценария. После внедрения эти SDK могут легко поддерживать совместную работу без изменения строки кода.
Способ использования
Выполните команду для прямой установки зависимости: композитору требуется yurunsoft/жрать-свул ~1.1
Процессор глобальных настроек:
request('GET', 'http://www.baidu.com', [
'verify' => false,
]);
var_dump($response->getStatusCode());
});
Чтобы вручную указать процессор swool:
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use Yurun\Util\Swoole\Guzzle\SwooleHandler;
go(function(){
$handler = new SwooleHandler();
$stack = HandlerStack::create($handler);
$client = new Client(['handler' => $stack]);
$response = $client->request('GET', 'http://www.baidu.com', [
'verify' => false,
]);
var_dump($response->getBody()->__toString(), $response->getHeaders());
});Юрун Http
Yurunhttp-это библиотека классов PHP HTTP с открытым исходным кодом, которая поддерживает работу с цепочками и проста в использовании.
Он поддерживает все распространенные режимы получения, публикации, размещения, удаления, обновления и других запросов, управление файлами cookie на уровне браузера, загрузку и загрузку, настройку и чтение заголовка, файлов cookie, параметров запроса, неудачную повторную попытку, ограничение скорости, агента, сертификата и т.д.
Версия 3.0 идеально поддерживает совместную работу curl и swool; версия 3.2 поддерживает клиент swool websocket.
Способ использования
Выполните команду для прямой установки зависимости: composer требует yurunsoft/yurun-http ~3.2
get('http://www.baidu.com');
echo 'html:', PHP_EOL, $response->body();
}К моменту выпуска hook curl, новое дополнение к swool 4.4, все еще оставалось экспериментальной функцией. Хотя Yurun внес часть кода для этой функции, я пока не рекомендую использовать hook curl, потому что существует слишком много опций, которые не поддерживаются из-за огромной нагрузки на совместимость.
При использовании guzzle swool и yurunhttp вы можете задать мне любые вопросы в группе (группа QQ: 17916227).