Розширення parallel дозволяє виконувати PHP-код в паралельних потоках. Воно доступне в PHP ≥ 7.2.0. Для parallel ≥ 1.2.0 потрібна версія PHP ≥ 8.0.0.
Це стислий опис загального алгоритму parallel. Більше інформації є в наступних частинах розділу.
Клас parallel\Runtime представляє потік інтерпретатора PHP. Клас parallel\Runtime можна налаштувати за допомогою необов'язкового файлу ініціалізації, який потрібно передати в метод parallel\Runtime::__construct(). Зазвичай цей файл є автозавантажувачем чи чимсь на кшталт процедури попереднього завантаження: він буде підключатися перед виконанням кожного завдання.
Після створення, примірник parallel\Runtime залишається доступним, допоки його не закриють чи знищать відповідно до правил визначення області видимості об'єктів PHP. Метод parallel\Runtime::run() дозволяє програмісту планувати запуски паралельних завдань. Клас parallel\Runtime послуговується принципом FIFO (перший прийшов — перший вийшов), тобто завдання виконуються в тій послідовності, у якій вони були заплановані.
parallel реалізує функціональний API вищого рівня поверх parallel\Runtime, надаючи єдину функціональну точку входу для паралельного виконання коду з автоматичним плануванням — функцію parallel\run().
Завдання — це просте замикання (Closure), яке потрібно буде виконати паралельно. Замикання (Closure) може містити більшість інструкцій, навіть вкладені замикання. Проте є інструкції, заборонені в завданнях:
yield
посилання
оголошення класу
оголошення функції з назвою
Зауваження:
Вкладеним замиканням дозволяється містити інструкції yield або посилання, але не оголошення класів чи функцій з назвами.
Зауваження:
Скрипти, що підключені в завданнях, жодних обмежень не мають.
Клас parallel\Future використовується для доступу до значень, що повертає завдання, і надає API для скасування завдання.
Завдання можна можна додати в чергу, вказати йому параметри, використовувати змінні лексичної області (тобто за значенням), та отримати результат виконання (через клас parallel\Future), таким чином встановивши однонаправлений зв'язок, дозволяючи програмісту передати дані в завдання, а потім отримати від нього відповідь. Для двонаправленого зв'язку між завданнями використовується API parallel\Channel, який утворює сокет-подібний зв'язок між завданнями, який програміст може використовувати для надсилання та отримання даних.
API parallel\Events реалізує власний цикл подій (Traversable) та метод parallel\Events::poll(). Це дозволяє програмісту працювати з набором каналів та/або ф'ючерсів. Програміст може просто додати канали та ф'ючерси в цикл подій, за бажанням встановивши вхідні дані для запису за допомогою методу parallel\Events::setInput(), та пройтися по подіях в циклі foreach: розширення parallel передаватиме дані від об'єктів та в об'єкти, коли вони стануть доступні, створюючи примірники parallel\Events\Event, що описують операції, які відбулися.