2013-08-27 1 views
0

Я пытаюсь использовать замыкание в качестве обратного вызова, когда поток выполняется. Однако я сталкиваюсь с тем, что кажется пределом/неудачей PHP или расширения pthread.Сохранение замыканий в потоке не работает

Мой стек dev работает на Win7 x64 с PHP 5.5.3 x86 TS, версия pthread 0.44.

Следующий код работает:

class Test 
{ 
    public $callbackVar; 
} 

$test = new Test(); 

$callbackVar = function() 
{ 
    echo "Callback var invoked."; 
}; 

$test->callbackVar = $callbackVar; 
$test->callbackVar->__invoke(); 

Но как только я получить тест из ниток, запустив скрипт выдает ошибку:

class Test extends Thread 
{ 
    public $callbackVar; 
    public function run() { } 
} 

$test = new Test(); 

$callbackVar = function() 
{ 
    echo "Callback var invoked."; 
}; 

$test->callbackVar = $callbackVar; 
// assert() returns true 
assert($test->callbackVar === null); 
$test->callbackVar->__invoke(); 

следующие выходные

Fatal error: Call to a member function __invoke() on a non-object 

У кого-нибудь была эта проблема? Любое возможное обходное решение? Я бы предпочел не использовать eval, если это возможно ... Я пробовал много обходных решений, таких как переключение на другое закрытие, использование ReflectionFunction, ... ничто не сокращает его.

+0

Какую версию PHP вы используете? – MisterBla

+0

Обновленный вопрос, забыли об этом ... –

+0

Я сделал [3v4l] (http://3v4l.org/RnEgH) вашего кода. Между 5.3 и 5.5.2 ошибок нет. Не уверен, что происходит дальше. – MisterBla

ответ

1

Zend не позволяет сериализовывать объекты закрытия.

Так что вам не стоит пытаться работать, возможно, в будущем в будущем Zend позволит сериализовать Closures, pthreads не потребует изменений в то время.

Вам просто нужно сделать это старомодным способом ...

Смежные вопросы