Показать страницуИстория страницыСсылки сюдаCopy this pageExport to MarkdownODT преобразованиеНаверх Вы загрузили старую версию документа! Сохранив её, вы создадите новую текущую версию с этим содержимым. Медиафайлы{{tag>php languages extension}} ====== Threading for PHP - Share Nothing ====== * https://github.com/krakjoe/pthreads ([[https://github.com/krakjoe/pthreads/tree/PHP5|5.x]] - [[https://github.com/krakjoe/pthreads|7.x]]) * https://github.com/krakjoe/pthreads-autoloading-composer * https://github.com/krakjoe/pthreads-polyfill ===== Примеры ===== <code php> $worker = new Worker(); $task = new class extends Threaded { public static $a; }; $task::$a = new class extends Threaded {}; $worker->start(); $worker->stack($task); $worker->shutdown(); </code> <code php> $task = new class extends Threaded { public static $a; }; $task::$a = new class extends Threaded {}; $pool = new Pool(2); $pool->submit($task); $pool->shutdown(); </code> <code php> <?php function demanding(...$params) { /* you have parameters here */ return array(rand(), rand()); } class Task extends Collectable { public function __construct(Threaded $result, $params) { $this->result = $result; $this->params = $params; } public function run() { $this->result[] = demanding(...$this->params); } protected $result; protected $params; } $pool = new Pool(16); $result = new Threaded(); while (@$i++<16) { $pool->submit( new Task($result, $argv)); } $pool->shutdown(); var_dump($result); ?> </code> <code php> class Scanner { public function performScan() { // Add initial task $initialTask = "Task 1"; TaskQueue::addTask($initialTask); $i = 0; while(true) { // Get task from queue $task = TaskQueue::getTask(); if ($task == null) break; // Handle task $parser[$i] = new Parser($task); $parser[$i]->start(); // Wait $thread = $parser[$i]; $thread->synchronized(function() use($thread) { while (!$thread->awake) { $thread->wait(); } }); // Join $i++; } // Done echo "Done\n"; } } class Parser extends Thread { private $task; public function __construct($task) { $this->task = $task; } public function run() { // Perform a time-consuming operation // This operation adds an unknown number of extra tasks sleep(1); // Add new tasks to queue foreach(range(0, 4) as $i) { TaskQueue::addTask("Task {$i}"); } // Notify $this->synchronized(function(){ $this->awake = true; $this->notify(); }); } } class TaskQueue { private static $queue = array(); public static function addTask($task) { self::$queue[] = $task; echo "Add task to queue!\n"; } public static function getTask() { if (sizeof(self::$queue) > 0) { $task = array_shift(self::$queue); echo "Get task from queue!\n"; return $task; } } } $scanner = new Scanner(); $scanner->performScan(); </code> ===== Документация ===== * http://docs.php.net/manual/ru/book.pthreads.php ===== Статьи ===== * https://habrahabr.ru/post/300952/ * [[https://habrahabr.ru/post/193270/|PHP IPC — Межпроцессное взаимодействие в PHP]]СохранитьПросмотрРазличияОтменить Сводка изменений Примечание: редактируя эту страницу, вы соглашаетесь на использование своего вклада на условиях следующей лицензии: CC0 1.0 Universal