Используя потоки PHP, я встретил несколько раз проблемы с фатальной ошибкой «Сериализация закрытия». Однако я не понимаю, как это происходит: я не пропускаю закрытие или какой-либо вызов в другой поток, иногда, когда я беру код вне проекта и запускаю его в одиночку, он работает, но не работает в проекте.
Поэтому я попытался сделать сценарий неудачным путем сериализации закрытия, чтобы понять, как он работает.
Этот код использует закрытие и фактически работает:
<?php class MyWorker extends Worker { protected $kernel; protected $container; public function __construct($closure) { echo "Worker::__construct()"; echo PHP_EOL; echo $closure(); echo PHP_EOL; } public function run() { echo "Worker::run()"; echo PHP_EOL; } } class Toto { protected $c; public function __construct() { $this->c = function() { return "CLOSURE"; }; } public function go() { $c = $this->c; $pool = new Pool(4, MyWorker::class, [function(){ return "WORKER_CLOSURE"; }]); $pool->submit(new class ($c) extends Threaded { public function __construct($c) { $this->c = $c; } public function run() { $c = $this->c; echo $c(); echo "Threaded::run()"; echo PHP_EOL; } }); } } $toto = new Toto; $toto->go();
При работе в одиночку. Но внутри команды Symfony следующий код просто терпит неудачу. Я не понимаю, почему я не могу это исправить:
<?php use Threaded; use Thread; class Foo { public function run() { $t = new Thread; $t->start(); $t->join(); } }
Поэтому я подумал, возможно, это потому, что этот код выполнен в закрытии (я не знаю, но, возможно), поэтому я попробовал это:
$c = function() { $t = new class extends Thread { public function run() { echo "yo"; } }; $t->start(); $t->join(); }; $c();
И это работает. Так что прохождение закрытия к нити работает, строит, запускает и присоединяет поток изнутри закрытия, также работает, я не знаю, где искать сейчас …
Я тоже смотрю на это: хранение замыканий в потоке завершается неудачно , но код устарел, и теперь он работает (PHP 7, pthreads 3.x). Итак, здесь я прошу помочь понять, что на самом деле проблема с Closure …