Введение

pht - это новый модуль потоков для PHP. Он позволяет объединять классы, функции и даже целые файлы. В настоящее время pht можно использовать только с PHP 7.2. Это связано с тем, что режим ZTS небезопасен в PHP 7.0 и 7.1. Скоро появится поддержка PHP >7.2.

Внимание

Модуль pht не следует использовать в среде веб-сервера. Распределение потоков следует ограничивать только приложениями на основе интерфейса командной строки.

Подход к потоковой передаче, который использует pht, заключается в том, чтобы абстрагироваться от самого потока за выделенным объектом (pht\Thread). Затем задачи добавляются во внутреннюю очередь задач потока, где они обрабатываются при запуске потока (с помощью pht\Thread::start()).

Все задачи потока будут выполняться изолированно внутри только что созданного потока. Для задач класса это означает, что порожденные объекты не могут передаваться между потоками. Благодаря тому, что контексты потоковой обработки полностью отделены друг от друга, отпадает необходимость в сериализации свойств потоковых объектов (что является неизбежным злом, если такие объекты должны работать в нескольких потоках).

Изоляция контекстов потоковой передачи делает передачу данных между ними несколько проблематичной. Для решения этой проблемы были реализованы потоковые структуры данных (pht\HashTable, pht\Vector, и pht\Queue), позволяющие двухсторонний стиль связи между потоками, при котором они выставляют блокировки мьютекса для контроля своей целостности. Эти структуры данных могут безопасно передаваться между потоками и управляться несколькими потоками, используя блокировки мьютекса, которые были упакованы вместе с ними. Они подсчитываются по ссылкам в потоках, поэтому их не нужно явно уничтожать. Такой подход к потоковой передаче означает, что между потоками необходимо безопасно передавать только заданные встроенные структуры данных.

Атомарные значения также поддерживаются pht. В настоящее время существует только класс pht\AtomicInteger. Подобно многопоточным структурам данных, их тоже можно безопасно передавать между потоками.