Mastering Swoole PHP: Build High Performance Concurrent System with Async and Coroutines / Осваиваем Swoole PHP: построение высокопроизводительной конкурентной системы с асинхронностью и корутинами: Режим командной строки

Оглавление
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

Режим командной строки PHP
Простейший PHP CLI работает так:

bubenok 09.02.22 в 11:10

0

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

bubenok 09.02.22 в 11:10

0

Команда php -v выводит информацию о версии PHP и авторских правах, а затем завершает работу. На момент написания мы использовали PHP 7.4.6.

bubenok 09.02.22 в 11:11

0

Мы также можем выполнить простой скрипт, просто передав местоположение PHP-файла в команду PHP. Если у вас есть файл с именем app.php, вы можете выполнить следующую команду:

bubenok 09.02.22 в 11:12

0

php app.php

bubenok 09.02.22 в 11:12

0

Содержимое файла app.php может быть очень простым PHP-кодом или большим сложным приложением:

bubenok 09.02.22 в 11:13

0

<?php
echo1234;

bubenok 09.02.22 в 11:13

0

Сценарий завершается, когда последовательность строк кода завершена, так PHP-FPM использует процессы PHP. Когда есть новый HTTP-запрос, PHP-FPM создает процесс PHP и отправляет данные в процесс PHP, затем получает выходные данные процесса, освобождает все переменные памяти, используемые в процессе PHP, а затем делает это всё снова для следующего запроса. В реальности PHP-FPM может предварительно запускать и повторно использовать сам процесс Linux для нескольких запросов, потому что есть накладные расходы на запуск нового процесса Linux, но все переменные, используемые в одном процессе, освобождаются, по умолчанию ничего не используется совместно. между разными запросами.

bubenok 09.02.22 в 11:16

0

Мы также можем создать цикл, чтобы скрипт продолжал работать:

bubenok 09.02.22 в 11:17

0

<?php
while(1) {
​ echo time();
​ sleep(1);
}

bubenok 09.02.22 в 11:17

0

Такой скрипт будет печатать текущую метку времени каждую секунду, пока вы не нажмете CTRL-C, чтобы принудительно завершить процесс.

bubenok 09.02.22 в 11:18

0

Так работает демон PHP в командной строке. Внутри есть цикл, останавливающий завершение потока выполнения и предотвращающий остановку процесса.

bubenok 09.02.22 в 11:38

0

Все другие демоны и долго работающие приложения Linux должны работать аналогично.

bubenok 09.02.22 в 11:39

0

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

bubenok 09.02.22 в 11:41

0

<?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);
}

bubenok 09.02.22 в 11:42

0

Счетчик $i сохраняется как глобальная переменная внутри процесса и остается в нем до завершения. В каждом цикле счетчик увеличивался на 1.

bubenok 09.02.22 в 11:43

0

Пока что без взаимодействия и обмена данными с процессом этот пример не кажется полезным. Но func1 и func2 используют один и тот же процесс, один и тот же цикл. Это пример мультиплексирования.

bubenok 09.02.22 в 11:44

0

Если мы прокинем каналы в процесс, отправим данные в процесс и получим результаты работы функций, мы получим сервер. Если немного усложнить, то мы сможем создавать дочерние процессы для выполнения различных задач, что уже позволяет создать реальное приложение.

bubenok 09.02.22 в 11:48

0

На практике мультиплексирование всегда связано с вводом-выводом, процесс отвечает и обрабатывает запросы одновременно от нескольких внешних исполнителей. Еще одно различие между примером и реальным мультиплексированием заключается в том, что функции func1 и func2 могут переключаться друг на друга в середине процесса, если одна из функций переходит в состояние ожидания. Мы углубимся в эту тему в разделе «Синглплекс против мультиплекса».

bubenok 09.02.22 в 11:50

0

Именно в этом месте возникают корутины. Было бы здорово, если бы мы смогли использовать планировщик для планирования процесса между Func1 и Func2 на основе состояния ожидания ввода-вывода. Разработчику бы не пришлось думать о блокировке ввода-вывода, и при этом можно получить большую производительность, а также не явно использовать ключевые слова async/await или функции обратного вызова, чтобы разбить всю логику. Эти два подхода добавляют сложности в приложение и слой бизнес логики.

bubenok 09.02.22 в 11:59

0
Минутку...