🧵 PHP и многопоточность: куда всё реально движется (TrueAsync)Статья — не про «давайте добавим async». Она отвечает на более жёсткий вопрос:
способен ли PHP вообще эволюционировать к настоящему параллелизму — и какой ценой.
Коротко и без иллюзий 👇
❓ Зачем эта статьяRFC TrueAsync 1.7 упирается в будущее PHP Core. Асинхронность нельзя проектировать в вакууме — нужно понимать:
где у PHP фундаментальные ограничения,
можно ли выйти за рамки корутин,
возможна ли реальная многопоточность без слома экосистемы.
🧪 Эксперимент, который всё прояснилПопытка обрабатывать
CPU-тяжёлую телеметрию через корутины (Swoole):
I/O — отлично
CPU (сжатие, сериализация) —
просадка throughput ×2Вывод жёсткий, но честный:
Корутины не решают CPU-bound задачи.
Решение с выносом вычислений в отдельные процессы оказалось быстрее, несмотря на IPC.
🧠 Базовая модель: Single-threaded + offloadРабочая архитектура, уже доказавшая эффективность:
Event Loop (1 поток)I/O, сеть, БД, ожидание
Workers (несколько потоков / процессов)сжатие, криптография, парсинг, ML
Так работают:
🔸Node.js (Worker Threads)
🔸Python (asyncio + executors)
🔸 PHP (Swoole Request Workers + Task Workers)
✅ Плюсы модели
🔹 тысячи I/O-операций без mutex’ов
🔹 простота reasoning’а (нет гонок)
🔹 минимум требований к компилятору
🔹 контроль над нагрузкой
❌ Минусы
🔻 ручное разделение задач
🔻 легко ошибиться и положить event loop
🔻 плохо подходит для вычислительных систем
🧱 Почему PHP не готов к потокам «из коробки»Главная проблема —
память и GC:
🔸глобальный
object_store🔸refcount + stop-the-world GC
🔸память одного VM нельзя освобождать из другого потока
🔸ZTS ≠ настоящая многопоточность
PHP — строго
single-VM модель.
🧠 Ключевая идея: не делить память, а передавать владениеВместо shared mutable state:
🔸move-семантика объектов🔸если
refcount = 1 → перенос без копии
🔸иначе → deep copy с сохранением идентичности
Это:
🔸безопасно
🔸без сериализации
🔸прозрачно для разработчика
🧵 Что реально нужно в core🔸многопоточный memory manager🔸адаптация GC под параллельный режим
🔸поддержка shared immutable объектов (
GC_SHARE)
🔸исследование region-based memory
Это не «хотелки», а необходимые условия.
🧩 Корутины + потоки вместеПоток =
Awaitable.
🔸корутина не блокируется
🔸CPU-задача уходит в thread pool
🔸event loop остаётся отзывчивым
Код выглядит
последовательно, но работает параллельно.
🎭 Самая сильная абстракция — ActorsActors дают:
🔸изолированное состояние
🔸последовательную обработку сообщений
🔸отсутствие mutex’ов
естественное OOP-мышление
Каждый actor:
🔸может жить в своём потоке
🔸имеет собственный регион памяти
🔸безопасно масштабируется
Это
реальный путь к безопасной многопоточности в PHP.
🔗
MediumБиблиотека пхпшника