Mastering Swoole PHP: Build High Performance Concurrent System with Async and Coroutines / Осваиваем Swoole PHP: построение высокопроизводительной конкурентной системы с асинхронностью и корутинами
Тексты / Научно-техническая литература / IT
Книга о том, как работаету Swoole PHP и о подводных камнях, поджидающих новых разработчиков, приходящих в мир Swoole PHP.
В этой книге также рассказывается об общих концепциях построения высокопроизводительной веб-системы с высоким уровнем конкурентности, о том, как эти концепции реализованы в Swoole PHP и как работает расширенный PHP.
Эта книга предоставляет достаточно знаний о ядре ОС Linux с примерами кода, которые помогут вам понять, как работает асинхронный ввод-вывод, конкурентность и корутины.
Начав изучать или использовать новый фреймоврк, люди всегда исходят из предыдущего опыта. Какой-то опыт оказывается полезен для понимания новой системы, а какой-то может привести к неправильному пониманию новой системы. Эта книга знакомит с подводными камнями, которых следует избегать, если вы опытный разработчик PHP.
Эта книга предназначена для разработчиков, которые уже знают основы работы веб-систем, таких как веб-приложение PHP или приложение на других языках программирования, таких как Node.js, Golang или Java.
После прочтения этой книги вы сможете с уверенностью построить высокопроизводительную систему Swoole PHP.
В этой книге также рассказывается об общих концепциях построения высокопроизводительной веб-системы с высоким уровнем конкурентности, о том, как эти концепции реализованы в Swoole PHP и как работает расширенный PHP.
Эта книга предоставляет достаточно знаний о ядре ОС Linux с примерами кода, которые помогут вам понять, как работает асинхронный ввод-вывод, конкурентность и корутины.
Начав изучать или использовать новый фреймоврк, люди всегда исходят из предыдущего опыта. Какой-то опыт оказывается полезен для понимания новой системы, а какой-то может привести к неправильному пониманию новой системы. Эта книга знакомит с подводными камнями, которых следует избегать, если вы опытный разработчик PHP.
Эта книга предназначена для разработчиков, которые уже знают основы работы веб-систем, таких как веб-приложение PHP или приложение на других языках программирования, таких как Node.js, Golang или Java.
После прочтения этой книги вы сможете с уверенностью построить высокопроизводительную систему Swoole PHP.
Оглавление:
| Название | Статус | Активность | Готово | |
|---|---|---|---|---|
| Часть 1: Введение | переводится | > 1 года | 100% (7 / 7) | читать |
| О чем эта книга? | переводится | > 1 года | 100% (6 / 6) | читать |
| Что такое Swoole PHP | переводится | > 1 года | 100% (13 / 13) | читать |
| Часть 2: Основы | > 1 года | 100% (11 / 11) | читать | |
| PHP-FPM без сохранения состояния | переводится | > 1 года | 100% (3 / 3) | читать |
| Преимущества отсутствия сохранения состояния | переводится | > 1 года | 100% (4 / 4) | читать |
| Оборотная сторона отсутствия сохранения состояния | переводится | > 1 года | 100% (2 / 2) | читать |
| Резюме | переводится | > 1 года | 100% (2 / 2) | читать |
| Блокирование ввода/вывода в PHP-FPM | переводится | > 1 года | 100% (6 / 6) | читать |
| Проблемы производительности | переводится | > 1 года | 100% (18 / 18) | читать |
| Проблемы конкурентности | переводится | > 1 года | 100% (17 / 17) | читать |
| Быстрые и медленные компоненты | переводится | > 1 года | 100% (6 / 6) | читать |
| Конкурентные модели | переводится | > 1 года | 100% (7 / 7) | читать |
| Модели конкурентного программирования | переводится | > 1 года | 100% (12 / 12) | читать |
| Резюме | переводится | > 1 года | 100% (2 / 2) | читать |
| PHP в командной строке | переводится | > 1 года | 100% (3 / 3) | читать |
| Режим командной строки | переводится | > 1 года | 100% (20 / 20) | читать |
| Резюме | переводится | > 1 года | 100% (1 / 1) | читать |
| Часть 3: Основные концепции | > 1 года | 100% (1 / 1) | читать | |
| Исполнитель и контейнеры выполнения | переводится | > 1 года | 100% (9 / 9) | читать |
| Контейнеры общего исполнения | переводится | > 1 года | 100% (22 / 22) | читать |
| Вытесняющая и кооперативная многозадачность | переводится | > 1 года | 100% (5 / 5) | читать |
| Коммуникация и синхронизация состояний | переводится | > 1 года | 100% (5 / 5) | читать |
| Резюме | переводится | > 1 года | 100% (4 / 4) | читать |
| Управление жизненным циклом | переводится | > 1 года | 100% (4 / 4) | читать |
| Жизненный цикл переменной | переводится | > 1 года | 100% (5 / 5) | читать |
| Жизненный цикл процесса | переводится | > 1 года | 100% (4 / 4) | читать |
| Жизненный цикл TCP-соединения | переводится | > 1 года | 100% (15 / 15) | читать |
| Некоторые факты о TCP-соединениях | переводится | > 1 года | 100% (16 / 16) | читать |
| Резюме | переводится | > 1 года | 100% (2 / 2) | читать |
| Уменьшение связанности и слои | переводится | > 1 года | 100% (4 / 4) | читать |
| Некоторые послойные структуры | переводится | — | 0% (0 / 9) | |
| Ввод/вывод и снижение связанности CPU | переводится | — | 0% (0 / 3) | |
| Паттерн "Реактор" | переводится | — | 0% (0 / 7) | |
| Очередь, буфер, буферизация и пакетная обработка | (пусто) | |||
| Буфер и буферизация | переводится | — | 0% (0 / 6) | |
| Пакетная обработка | переводится | > 1 года | 25% (1 / 4) | читать |
| Очереди | переводится | — | 0% (0 / 4) | |
| Резюме | переводится | — | 0% (0 / 1) | |
| Трубы и каналы | переводится | — | 0% (0 / 5) | |
| Трубы Linux | переводится | — | 0% (0 / 4) | |
| Сокеты | переводится | — | 0% (0 / 3) | |
| Каналы корутин | переводится | — | 0% (0 / 3) | |
| Контекст, стек и переключение контекста | — | 0% (0 / 8) | ||
| Переключение контекста может быть дорогостоящим | переводится | — | 0% (0 / 4) | |
| Синглплекс против мультиплекса | переводится | — | 0% (0 / 5) | |
| Синглплекс | переводится | (пусто) | ||
| Мультиплекс | переводится | > 1 года | 0% (0 / 4) | |
| Процесс мультиплексирования и демультиплексирования | переводится | — | 0% (0 / 4) | |
| Резюме | переводится | — | 0% (0 / 2) | |
| Асинхронность | — | 0% (0 / 8) | ||
| Асинхронность с системной точки зрения | переводится | — | 0% (0 / 5) | |
| Синхронность - это природа внутренних компонентов | переводится | — | 0% (0 / 3) | |
| Асинхронность - это природа отдельных компонентов | переводится | — | 0% (0 / 7) | |
| Накладные расходы асинхронности | переводится | — | 0% (0 / 5) | |
| Задержка и пропускная способность | переводится | — | 0% (0 / 3) | |
| Модели асинхронности | переводится | — | 0% (0 / 2) | |
| Обратные вызовы | переводится | — | 0% (0 / 4) | |
| Ключевые слова async, await, yield, resume и promise | переводится | — | 0% (0 / 12) | |
| Файберы и корутины | переводится | — | 0% (0 / 4) | |
| State, stateless, stateful и pooling | переводится | — | 0% (0 / 4) | |
| Стоимость инициализации состояний | переводится | — | 0% (0 / 3) | |
| Без сохранения состояния | переводится | — | 0% (0 / 6) | |
| Сохранение состояние | переводится | > 1 года | 0% (0 / 15) | |
| Pool и pooling | переводится | — | 0% (0 / 11) | |
| Pooling памяти | переводится | — | 0% (0 / 3) | |
| Резюме | переводится | — | 0% (0 / 2) | |
| Файловые дескрипторы, поток ввода/вывода | переводится | — | 0% (0 / 7) | |
| Стандартный поток ввода/вывода в PHP | переводится | — | 0% (0 / 5) | |
| Подключить или перенаправить поток ввода/вывода | переводится | — | 0% (0 / 2) | |
| Блокирующий и неблокирующий режимы | переводится | — | 0% (0 / 5) | |
| Мультиплексирование потока ввода/вывода | переводится | — | 0% (0 / 6) | |
| Исключения и таймауты | переводится | — | 0% (0 / 3) | |
| Крайние случаи | переводится | — | 0% (0 / 4) | |
| Обработка таймаутов | переводится | — | 0% (0 / 7) | |
| Error vs Exceptions | переводится | — | 0% (0 / 12) | |
| Повторная попытка и идемпотентность | переводится | — | 0% (0 / 7) | |
| Обработка исключений в Swoole PHP | переводится | — | 0% (0 / 3) | |
| Протокол | переводится | — | 0% (0 / 2) | |
| Шаблоны запросов и ответов | переводится | — | 0% (0 / 4) | |
| Упаковка двоичного протокола в PHP | переводится | — | 0% (0 / 3) | |
| Протоколы TCP и UDP | переводится | — | 0% (0 / 3) | |
| Протокол на основе TCP | переводится | — | 0% (0 / 11) | |
| Пользовательский протокол по TCP | переводится | > 1 года | 0% (0 / 11) | |
| Конкурентность и модель ввода/вывода | (пусто) | |||
| Параллельность и конкурентность | переводится | — | 0% (0 / 6) | |
| Конкурентные модели ввода/вывода | переводится | — | 0% (0 / 36) | |
| Резюме | переводится | — | 0% (0 / 3) | |
| Событийность и обратные вызовы | переводится | (пусто) | ||
| События и событийность | переводится | — | 0% (0 / 7) | |
| Функции обратного вызова | переводится | — | 0% (0 / 7) | |
| Факты, затраты и ограничения | переводится | — | 0% (0 / 2) | |
| Значения задержек | переводится | — | 0% (0 / 3) | |
| Числовое описание задержки | переводится | — | 0% (0 / 6) | |
| Кэш и кэширование | переводится | — | 0% (0 / 5) | |
| Размер стека | переводится | — | 0% (0 / 8) | |
| Количество файловых дескрипторов | переводится | — | 0% (0 / 9) | |
| Переключение контекста и ограничение памяти | переводится | — | 0% (0 / 4) | |
| Ограничения скорости и ограничения конкурентности | переводится | — | 0% (0 / 6) | |
| Теория очередей | переводится | — | 0% (0 / 8) | |
| Часть IV: Практический мир ОС Linux | — | 0% (0 / 1) | ||
| Пользовательский режим и режим ядра | переводится | — | 0% (0 / 10) | |
| Системный вызов в ядре ОС | переводится | — | 0% (0 / 7) | |
| Переключение контекста | переводится | — | 0% (0 / 4) | |
| Управление памятью | переводится | — | 0% (0 / 2) | |
| Память стека | переводится | — | 0% (0 / 4) | |
| Память кучи | переводится | — | 0% (0 / 4) | |
| Управление памятью | — | 0% (0 / 3) | ||
| Процесс, поток и корутины | переводится | (пусто) | ||
| Процесс Linux | переводится | — | 0% (0 / 6) | |
| Разветвление процесса и копирование памяти | переводится | > 1 года | 0% (0 / 18) | |
| Потоки Linux | переводится | — | 0% (0 / 7) | |
| Корутины Swoole PHP | переводится | — | 0% (0 / 7) | |
| Сокеты и сетевой ввод-вывод | переводится | (пусто) | ||
| Сокеты | переводится | — | 0% (0 / 14) | |
| Обработка тайм-аута и исключений | переводится | — | 0% (0 / 8) | |
| Блокирующий и неблокирующий ввод/вывод | переводится | — | 0% (0 / 11) | |
| Делаем сокеты неблокирующимися и мультиплексированными | переводится | — | 0% (0 / 18) | |
| Select | переводится | — | 0% (0 / 8) | |
| Poll и epoll | переводится | — | 0% (0 / 3) | |
| Резюме | переводится | — | 0% (0 / 4) | |
| Обратные вызовы, await async и корутины | переводится | — | 0% (0 / 6) | |
| Обратные вызовы | переводится | — | 0% (0 / 10) | |
| Промисы и цепочки then | переводится | — | 0% (0 / 4) | |
| Async и Await | переводится | — | 0% (0 / 4) | |
| Корутины и файберы | переводится | — | 0% (0 / 5) | |
| Справедливое планирование | переводится | — | 0% (0 / 7) | |
| Часть 5: Подключение с помощью протоколов | переводится | — | 0% (0 / 1) | |
| Протокол TCP/UDP | переводится | — | 0% (0 / 3) | |
| Жизненный цикл TCP-соединения | переводится | — | 0% (0 / 2) | |
| Стоимость установления соединения | переводится | — | 0% (0 / 2) | |
| Постоянное соединение | переводится | — | 0% (0 / 8) | |
| Резюме | переводится | — | 0% (0 / 3) | |
| Протокол HTTP | переводится | — | 0% (0 / 5) | |
| HTTP 1.1 сохранение соединения | переводится | — | 0% (0 / 4) | |
| HTTP 1.1 SSE | переводится | — | 0% (0 / 4) | |
| HTTP 1.1 тестирование произовдительности | переводится | — | 0% (0 / 6) | |
| Резюме | переводится | — | 0% (0 / 2) | |
| Протокол WebSocket | переводится | — | 0% (0 / 2) | |
| Рукопожатие и установление соединения | переводится | — | 0% (0 / 7) | |
| Модель протокола | переводится | — | 0% (0 / 4) | |
| Клиентская сторона JavaScript | переводится | — | 0% (0 / 5) | |
| Резюме | переводится | — | 0% (0 / 2) | |
| Протокол HTTP2 и gRPC | переводится | — | 0% (0 / 4) | |
| HTTP2 | переводится | — | 0% (0 / 31) | |
| gRPC | переводится | — | 0% (0 / 18) | |
| Веб-производительность | переводится | — | 0% (0 / 5) | |
| Дополнительные мысли | переводится | — | 0% (0 / 4) | |
| Резюме | переводится | — | 0% (0 / 3) | |
| Пользовательский протокол | переводится | — | 0% (0 / 4) | |
| Пользовательский протокол по TCP | переводится | — | 0% (0 / 14) | |
| Резюме | переводится | — | 0% (0 / 2) | |
| Часть 6: Среда выполнения Swoole и расширение PHP | переводится | — | 0% (0 / 1) | |
| Синтаксис PHP | переводится | > 1 года | 0% (0 / 5) | |
| Расширения PHP | переводится | — | 0% (0 / 6) | |
| Сравнение с жизненным циклом PHP-FPM | переводится | — | 0% (0 / 11) | |
| Структура Swoole PHP-сервера | переводится | — | 0% (0 / 10) | |
| Переменные и состояния | переводится | — | 0% (0 / 2) | |
| Типы переменных и скоуп | переводится | — | 0% (0 / 2) | |
| Глобальные переменные | переводится | — | 0% (0 / 10) | |
| Жизненный цикл переменной | переводится | — | 0% (0 / 6) | |
| Утечки памяти | переводится | — | 0% (0 / 6) | |
| Хранение переменной | переводится | — | 0% (0 / 5) | |
| Изолирование глобальных переменных для корутин | переводится | — | 0% (0 / 5) | |
| Переменная и конкурентность | переводится | — | 0% (0 / 5) | |
| Событийный цикл и асинхронный ввод/вывод | переводится | — | 0% (0 / 3) | |
| Мультиплексирование ввода/вывода | переводится | — | 0% (0 / 1) | |
| Событийный цикл | переводится | — | 0% (0 / 3) | |
| Системные вызовы: select, poll и epoll, kqueue | переводится | — | 0% (0 / 24) | |
| Хуки Swoole для клиентских библиотек | переводится | > 1 года | 0% (0 / 5) | |
| Корутины Swoole PHP | переводится | — | 0% (0 / 5) | |
| Boost. Библиотека контекста | переводится | — | 0% (0 / 6) | |
| Виртуальная машина PHP | переводится | — | 0% (0 / 4) | |
| Чем полезны корутины? | переводится | — | 0% (0 / 4) | |
| Коды блокировки ввода/вывода | переводится | — | 0% (0 / 1) | |
| Резюме | переводится | — | 0% (0 / 1) | |
| Множественный режим выполнения | переводится | — | 0% (0 / 1) | |
| Режим BASE и режим PROCESS | переводится | — | 0% (0 / 5) | |
| Коды асинхронного ввода/вывода и блокировки ввода/вывода | переводится | — | 0% (0 / 2) | |
| Режим блокировки | переводится | — | 0% (0 / 3) | |
| Часть 7: Практика Swoole PHP | — | 0% (0 / 1) | ||
| Сервер Swoole | переводится | — | 0% (0 / 1) | |
| Swoole TCP-сервер | переводится | — | 0% (0 / 4) | |
| Swoole UDP-сервер | переводится | — | 0% (0 / 6) | |
| Swoole HTTP-сервер | переводится | — | 0% (0 / 8) | |
| Swoole HTTP2-сервер | переводится | — | 0% (0 / 3) | |
| Swoole Redis-сервер | переводится | — | 0% (0 / 6) | |
| Резюме | переводится | — | 0% (0 / 1) | |
| Swoole сервер-воркеры | переводится | — | 0% (0 / 9) | |
| Главный процесс | переводится | — | 0% (0 / 2) | |
| Процесс менеджера | переводится | — | 0% (0 / 1) | |
| Процесс сервер-воркера | переводится | — | 0% (0 / 7) | |
| Процессорная близость сервер-воркеров | переводится | — | 0% (0 / 7) | |
| Процесс таск-воркера | переводится | — | 0% (0 / 4) | |
| Процесс Sidecar | переводится | — | 0% (0 / 1) | |
| Резюме | переводится | — | 0% (0 / 1) | |
| Процесс Swoole | переводится | — | 0% (0 / 6) | |
| Выполнение внешнего процесса | переводится | — | 0% (0 / 3) | |
| Пул процессов Swoole | переводится | — | 0% (0 / 3) | |
| Резюме | переводится | — | 0% (0 / 1) | |
| КлиентыSwoole | переводится | — | 0% (0 / 4) | |
| TCP-клиент с блокирующим вводом-выводом | переводится | — | 0% (0 / 3) | |
| TCP-клиент с асинхронным вводом-выводом корутин | переводится | — | 0% (0 / 5) | |
| HTTP-клиент Swoole корутин | переводится | — | 0% (0 / 4) | |
| Совместимые с корутинами клиентские библиотеки PHP | переводится | — | 0% (0 / 4) | |
| Swoole Coroutine FastCGI-клиент | переводится | — | 0% (0 / 2) | |
| Резюме | переводится | — | 0% (0 / 1) | |
| Swoole Table | переводится | — | 0% (0 / 6) | |
| Swoole Timer | переводится | — | 0% (0 / 6) | |
| Swoole корутины и каналы | переводится | (пусто) | ||
| Контекст корутин Swoole | переводится | — | 0% (0 / 1) | |
| Корутины Swoole | переводится | — | 0% (0 / 4) | |
| Структуры корутин Swoole | переводится | — | 0% (0 / 2) | |
| Каналы Swoole | переводится | — | 0% (0 / 6) | |
| Тайм-аут операции | переводится | — | 0% (0 / 1) | |
| Закрытие канала | переводится | — | 0% (0 / 2) | |
| Часть 8: Примеры использования и шаблоны | — | 0% (0 / 1) | ||
| HTTP сервисы | переводится | (пусто) | ||
| Создание простого сервиса HTTP 1.1 с помощью Swoole PHP | переводится | — | 0% (0 / 4) | |
| Размещение статичных файлов на сервере Swoole | переводится | — | 0% (0 / 4) | |
| Обработка данных | переводится | — | 0% (0 / 1) | |
| Проблема одного процесса PHP скрипта | переводится | — | 0% (0 / 1) | |
| Использование всех ресурсов для обработки данных | переводится | — | 0% (0 / 1) | |
| Использование мощности нескольких машин | переводится | — | 0% (0 / 1) | |
| Прокси HTTP и PHP-FPM | переводится | — | 0% (0 / 1) | |
| Прокси HTTP | переводится | — | 0% (0 / 2) | |
| Прокси PHP-FPM | переводится | — | 0% (0 / 3) | |
| Процесс Sidecar | переводится | — | 0% (0 / 4) | |
| Служба TCP | переводится | — | 0% (0 / 8) | |
| Сервер WebSocket | переводится | (пусто) | ||
| "Hello World" WebSocket сервера | переводится | — | 0% (0 / 5) | |
| Служба таймера WebSocket | переводится | — | 0% (0 / 7) | |
| Планировщик задач | переводится | — | 0% (0 / 5) | |
| Производитель и Потребитель | переводится | — | 0% (0 / 2) | |
| Использование корутин | переводится | — | 0% (0 / 3) | |
| Использование процесса | переводится | — | 0% (0 / 2) | |
| Маппинг M:N конкурентности | переводится | — | 0% (0 / 7) | |
| Мультиплексирование и демультиплексирование | переводится | — | 0% (0 / 1) | |
| Протокол мультиплексирования | переводится | — | 0% (0 / 2) | |
| Несколько слов о конкурентности MySQL | переводится | — | 0% (0 / 2) | |
| Сервер протокола мультиплексирования | переводится | — | 0% (0 / 1) | |
| Резюме | переводится | — | 0% (0 / 2) | |
| Пул соединений | переводится | — | 0% (0 / 4) | |
| Реализация пула ресурсов с помощью SplQueue | переводится | — | 0% (0 / 8) | |
| Встроенный пул подключений | переводится | > 1 года | 0% (0 / 3) | |
| Определение собственного пула соединений | переводится | — | 0% (0 / 2) | |
| Резюме | переводится | — | 0% (0 / 1) | |
| Web spider и scraper | переводится | — | 0% (0 / 7) | |
| Система PUBSUB | переводится | — | 0% (0 / 2) | |
| Создание простой PUBSUB с помощью Swoole | переводится | — | 0% (0 / 7) | |
| Отправляемые сервером события (SSE) | переводится | — | 0% (0 / 8) | |
| Интеграция с процессом Linux | переводится | — | 0% (0 / 7) | |
| Резюме | переводится | — | 0% (0 / 1) | |
| Управление сервисами: RPC и gRPC | переводится | — | 0% (0 / 4) | |
| Определение протокола gRPC | переводится | — | 0% (0 / 3) | |
| Клиент gRPC на Swoole | переводится | — | 0% (0 / 3) | |
| Сервер gRPC на Swoole | переводится | — | 0% (0 / 5) | |
| Резюме | переводится | — | 0% (0 / 1) | |
| Ограничение скорости | переводится | (пусто) | ||
| Общая идея | переводится | — | 0% (0 / 4) | |
| Попробуйте и почувствуйте | переводится | — | 0% (0 / 3) | |
| Использование ограничителей скорости в службе HTTP | переводится | — | 0% (0 / 3) | |
| Резюме | переводится | — | 0% (0 / 1) | |
| Разработка собственных протоколов TCP | переводится | > 1 года | 41.6% (5 / 12) | читать |
| Мониторинг и отчетность | переводится | > 1 года | 100% (2 / 2) | читать |
| Часть 9: Хостинг и развертывание | > 1 года | 100% (1 / 1) | читать | |
| Docker и Kubernetes | переводится | > 1 года | 100% (4 / 4) | читать |
| Создайте собственный Dockerfile | переводится | > 1 года | 100% (4 / 4) | читать |
| Процесс переднего плана | переводится | > 1 года | 100% (1 / 1) | читать |
| Управление логами приложения Swoole | переводится | > 1 года | 100% (1 / 1) | читать |
| Запуск на AWS EC2 или на голом железе | переводится | > 1 года | 100% (1 / 1) | читать |
| Настройка количества воркеров сервера Swoole | переводится | > 1 года | 100% (4 / 4) | читать |
| Демонизация и передний план | переводится | > 1 года | 100% (4 / 4) | читать |
| Управление процессом приложения Swoole | переводится | > 1 года | 100% (7 / 7) | читать |
| Управление процессом Swoole с помощью PHP-кода | переводится | > 1 года | 100% (3 / 3) | читать |
| Управление логированием приложения Swoole | переводится | > 1 года | 100% (3 / 3) | читать |
| Наблюдение и кеширование с внешним прокси | переводится | > 1 года | 100% (1 / 1) | читать |
| Не конец | переводится | > 1 года | 100% (4 / 4) | читать |
Перевод
- Перевод:
- текст с английского на русский
- Создан:
- 17 января 2021, владелец: bubenok
- Права доступа:
-
войти все видеть чужие версии все скачивать результат все оценивать перевод группа комментировать перевод группа переводить группа читать блог все комментировать блог группа писать в блог группа анонсировать модераторы редактировать оригинал модераторы редактировать описание никто управлять группой модераторы Участие в группе после подтверждения модераторами - Готово:
-
20.12% КП = 1.0
