Thread
Winter Thread предоставляет чистый, объектно-ориентированный API для запуска фоновых
процессов в PHP и управления ими — знакомый интерфейс в стиле потоков для параллельных
и длительных задач, построенный на изолированных процессах ОС. Он абстрагирует сложности
proc_open и POSIX-сигналов в мощный и удобный интерфейс.
Это движок — а Thread это процесс
Winter Thread — это небольшой надёжный движок, а не фреймворк «со всем в комплекте»:
слой, поверх которого строятся ваши очереди, пулы, планировщики и воркеры. И Thread
здесь — процесс, а не поток PHP: имя повторяет знакомый API (как multiprocessing.Process
в Python повторяет интерфейс потоков), поэтому каждый Thread — это один изолированный
процесс ОС с фасадом start() / join() / isAlive(). См. Ментальную модель.
Философия
В основе — удобная для разработчика Java-подобная модель потоков в языке, где встроенной многопоточности традиционно нет. Это достигается за счёт использования отдельных процессов уровня ОС:
- Настоящий параллелизм — каждая задача выполняется в собственном процессе и может быть запланирована на другом ядре CPU, обеспечивая реальное параллельное выполнение.
- Изоляция — процессы полностью изолированы. Фатальная ошибка или утечка памяти в одном дочернем процессе никогда не затрагивает основное приложение или другие дочерние процессы.
- Простота — чистый API
ThreadиRunnableпозволяет сосредоточиться на логике задачи, а не на пайпах, сигналах и сериализации.
Основные концепции
- Thread — объект, управляющий дочерним процессом: запуск, остановка, мониторинг.
- Runnable — интерфейс, представляющий единицу работы. Любой класс, реализующий его, может
быть выполнен через
Thread; ваша логика живёт вrun(). - Runner-скрипт — внутренний исполняемый файл (
wRunner), который инициализирует новый процесс, десериализует задачу и запускает её. - Launcher — сторона родителя: запускает процесс и владеет секретом подписи payload.
По умолчанию берётся
AdaptiveLauncher, который выбирает бэкенд под текущий рантайм —CliLauncherдля CLI и FPM,SwooleLauncherвнутри корутины.
Ключевые возможности
- Гибкий, объектно-ориентированный API — управляйте фоновыми процессами как объектами.
- Полный контроль над процессом —
start(),join(),pause(),resume(),terminate(),kill(). - Продвинутое именование процессов — идентифицируйте процессы через пространства имён, имена и теги.
- Безопасность по умолчанию — вывод направляется в
/dev/null, поэтому нет риска Broken pipe для задач по принципу «запустил и забыл». - Совместимость со Swoole / event-loop — под активным рантаймом Swoole запуск идёт через
SwooleLauncher, а payload доставляется без пайпа (разделяемая память или временный файл), поэтому дескрипторы реактора остаются целы. - Сменный бэкенд запуска — интерфейс
Launcherсостоит всего из двух методов, так что свой способ запуска (Docker, SSH, удалённый узел) подключается черезThread::bindLauncher(). - Java-подобный API — знакомые имена методов, такие как
isAlive()иjoin().
Хорошо подходит для
Независимых задач, которым не нужен сложный IPC: тяжёлые вычисления (кодирование изображений/видео, генерация отчётов), задачи с интенсивным I/O (пакетная отправка писем, внешние API) или вынос любой длительной операции, чтобы основной поток оставался отзывчивым.
Требования
- PHP ≥ 8.4
ext-pcntl,ext-posix- POSIX-совместимая ОС (Linux, macOS, BSD) — несовместимо с Windows
opis/closure^4.5— обеспечивает безопасную сериализацию анонимных классов и замыканий
Установка
composer require flytachi/winter-threadБыстрый старт
Определите задачу, оберните её в Thread и запустите — ваш скрипт никогда не блокируется:
$thread = new Thread(new ReportGenerator(42));
$pid = $thread->start(); // выполняется в фоне, возвращает управление сразу
$thread->join(); // опционально: дождаться завершенияПройдите весь путь от начала до конца — от установки до проверенной фоновой задачи за пять минут — в Быстром старте.
Исходники и ссылки
- GitHub — github.com/flytachi/winter-thread
- Packagist — packagist.org/packages/flytachi/winter-thread
Продолжите с Установки и требований, Быстрого старта и Ментальной модели.