Готовый перевод Mastering Swoole PHP: Build High Performance Concurrent System with Async and Coroutines / Осваиваем Swoole PHP: построение высокопроизводительной конкурентной системы с асинхронностью и корутинами: Режим командной строки
Режим командной строки PHP
Простейший PHP CLI работает так:
php -v
PHP 7.4.6(cli)(built: May 14 2020 10:40:11)(NTS)
Copyright(c)The PHP Group
Zend Engine v3.4.0, Copyright(c)Zend Technologies
with Zend OPcache v7.4.6, Copyright(c), by Zend Technologies
Команда php -v выводит информацию о версии PHP и авторских правах, а затем завершает работу. На момент написания мы использовали PHP 7.4.6.
Мы также можем выполнить простой скрипт, просто передав местоположение PHP-файла в команду PHP. Если у вас есть файл с именем app.php, вы можете выполнить следующую команду:
php app.php
Содержимое файла app.php может быть очень простым PHP-кодом или большим сложным приложением:
<?php
echo1234;
Сценарий завершается, когда последовательность строк кода завершена, так PHP-FPM использует процессы PHP. Когда есть новый HTTP-запрос, PHP-FPM создает процесс PHP и отправляет данные в процесс PHP, затем получает выходные данные процесса, освобождает все переменные памяти, используемые в процессе PHP, а затем делает это всё снова для следующего запроса. В реальности PHP-FPM может предварительно запускать и повторно использовать сам процесс Linux для нескольких запросов, потому что есть накладные расходы на запуск нового процесса Linux, но все переменные, используемые в одном процессе, освобождаются, по умолчанию ничего не используется совместно. между разными запросами.
Мы также можем создать цикл, чтобы скрипт продолжал работать:
<?php
while(1) {
echo time();
sleep(1);
}
Такой скрипт будет печатать текущую метку времени каждую секунду, пока вы не нажмете CTRL-C, чтобы принудительно завершить процесс.
Так работает демон PHP в командной строке. Внутри есть цикл, останавливающий завершение потока выполнения и предотвращающий остановку процесса.
Все другие демоны и долго работающие приложения Linux должны работать аналогично.
Вместо того, чтобы выполнить один последовательность строк кода и остановиться, мы можем создать цикл и скрипт продолжит работать. Таким образом, мы можем создать своего рода мультиплексирование, выполнять несколько последовательностей функций в рамках одного процесса и одного и того же цикла. Поскольку мы не завершаем процесс, мы можем хранить внутри процесса своего рода контекстные данные.
<?php
function func1() {
$time=time();
echo "time:$time\n";
}
function func2() {
global $i;
$i = $ i + 1;
echo "number: $i\n";
}
while(1) {
func1();
func2();
sleep(1);
}
Счетчик $i сохраняется как глобальная переменная внутри процесса и остается в нем до завершения. В каждом цикле счетчик увеличивался на 1.
Пока что без взаимодействия и обмена данными с процессом этот пример не кажется полезным. Но func1 и func2 используют один и тот же процесс, один и тот же цикл. Это пример мультиплексирования.
Если мы прокинем каналы в процесс, отправим данные в процесс и получим результаты работы функций, мы получим сервер. Если немного усложнить, то мы сможем создавать дочерние процессы для выполнения различных задач, что уже позволяет создать реальное приложение.
На практике мультиплексирование всегда связано с вводом-выводом, процесс отвечает и обрабатывает запросы одновременно от нескольких внешних исполнителей. Еще одно различие между примером и реальным мультиплексированием заключается в том, что функции func1 и func2 могут переключаться друг на друга в середине процесса, если одна из функций переходит в состояние ожидания. Мы углубимся в эту тему в разделе «Синглплекс против мультиплекса».
Именно в этом месте возникают корутины. Было бы здорово, если бы мы смогли использовать планировщик для планирования процесса между Func1 и Func2 на основе состояния ожидания ввода-вывода. Разработчику бы не пришлось думать о блокировке ввода-вывода, и при этом можно получить большую производительность, а также не явно использовать ключевые слова async/await или функции обратного вызова, чтобы разбить всю логику. Эти два подхода добавляют сложности в приложение и слой бизнес логики.
Внимание! Этот перевод, возможно, ещё не готов.
Его статус: идёт перевод
Переведено на Нотабеноиде
http://notabenoid.org/book/81342/496690
Переводчики: bubenok
Настройки
Готово:
