Mastering Swoole PHP: Build High Performance Concurrent System with Async and Coroutines / Осваиваем Swoole PHP: построение высокопроизводительной конкурентной системы с асинхронностью и корутинами: Режим командной строки
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Режим командной строки PHP bubenok 09.02.22 в 11:10 |
|
|
php -v bubenok 09.02.22 в 11:10 |
||
|
Команда php -v выводит информацию о версии PHP и авторских правах, а затем завершает работу. На момент написания мы использовали PHP 7.4.6. bubenok 09.02.22 в 11:11 |
||
|
Мы также можем выполнить простой скрипт, просто передав местоположение PHP-файла в команду PHP. Если у вас есть файл с именем app.php, вы можете выполнить следующую команду: bubenok 09.02.22 в 11:12 |
||
|
php app.php bubenok 09.02.22 в 11:12 |
||
|
Содержимое файла app.php может быть очень простым PHP-кодом или большим сложным приложением: bubenok 09.02.22 в 11:13 |
||
|
<?php bubenok 09.02.22 в 11:13 |
||
|
Сценарий завершается, когда последовательность строк кода завершена, так PHP-FPM использует процессы PHP. Когда есть новый HTTP-запрос, PHP-FPM создает процесс PHP и отправляет данные в процесс PHP, затем получает выходные данные процесса, освобождает все переменные памяти, используемые в процессе PHP, а затем делает это всё снова для следующего запроса. В реальности PHP-FPM может предварительно запускать и повторно использовать сам процесс Linux для нескольких запросов, потому что есть накладные расходы на запуск нового процесса Linux, но все переменные, используемые в одном процессе, освобождаются, по умолчанию ничего не используется совместно. между разными запросами. bubenok 09.02.22 в 11:16 |
||
|
Мы также можем создать цикл, чтобы скрипт продолжал работать: bubenok 09.02.22 в 11:17 |
||
|
<?php bubenok 09.02.22 в 11:17 |
||
|
Такой скрипт будет печатать текущую метку времени каждую секунду, пока вы не нажмете CTRL-C, чтобы принудительно завершить процесс. bubenok 09.02.22 в 11:18 |
||
|
Так работает демон PHP в командной строке. Внутри есть цикл, останавливающий завершение потока выполнения и предотвращающий остановку процесса. bubenok 09.02.22 в 11:38 |
||
|
Все другие демоны и долго работающие приложения Linux должны работать аналогично. bubenok 09.02.22 в 11:39 |
||
|
Вместо того, чтобы выполнить один последовательность строк кода и остановиться, мы можем создать цикл и скрипт продолжит работать. Таким образом, мы можем создать своего рода мультиплексирование, выполнять несколько последовательностей функций в рамках одного процесса и одного и того же цикла. Поскольку мы не завершаем процесс, мы можем хранить внутри процесса своего рода контекстные данные. bubenok 09.02.22 в 11:41 |
||
|
<?php bubenok 09.02.22 в 11:42 |
||
|
Счетчик $i сохраняется как глобальная переменная внутри процесса и остается в нем до завершения. В каждом цикле счетчик увеличивался на 1. bubenok 09.02.22 в 11:43 |
||
|
Пока что без взаимодействия и обмена данными с процессом этот пример не кажется полезным. Но func1 и func2 используют один и тот же процесс, один и тот же цикл. Это пример мультиплексирования. bubenok 09.02.22 в 11:44 |
||
|
Если мы прокинем каналы в процесс, отправим данные в процесс и получим результаты работы функций, мы получим сервер. Если немного усложнить, то мы сможем создавать дочерние процессы для выполнения различных задач, что уже позволяет создать реальное приложение. bubenok 09.02.22 в 11:48 |
||
|
На практике мультиплексирование всегда связано с вводом-выводом, процесс отвечает и обрабатывает запросы одновременно от нескольких внешних исполнителей. Еще одно различие между примером и реальным мультиплексированием заключается в том, что функции func1 и func2 могут переключаться друг на друга в середине процесса, если одна из функций переходит в состояние ожидания. Мы углубимся в эту тему в разделе «Синглплекс против мультиплекса». bubenok 09.02.22 в 11:50 |
||
|
Именно в этом месте возникают корутины. Было бы здорово, если бы мы смогли использовать планировщик для планирования процесса между Func1 и Func2 на основе состояния ожидания ввода-вывода. Разработчику бы не пришлось думать о блокировке ввода-вывода, и при этом можно получить большую производительность, а также не явно использовать ключевые слова async/await или функции обратного вызова, чтобы разбить всю логику. Эти два подхода добавляют сложности в приложение и слой бизнес логики. bubenok 09.02.22 в 11:59 |
