Пакет · thread

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 — обеспечивает безопасную сериализацию анонимных классов и замыканий

Установка

bash
composer require flytachi/winter-thread

Быстрый старт

Определите задачу, оберните её в Thread и запустите — ваш скрипт никогда не блокируется:

php
$thread = new Thread(new ReportGenerator(42));

$pid = $thread->start();   // выполняется в фоне, возвращает управление сразу
$thread->join();           // опционально: дождаться завершения

Пройдите весь путь от начала до конца — от установки до проверенной фоновой задачи за пять минут — в Быстром старте.

Исходники и ссылки

Продолжите с Установки и требований, Быстрого старта и Ментальной модели.