Это пример phpws, где я пытаюсь использовать многопоточность:
class Cli_TestHandler extends WebSocketUriHandler
{
public function onMessage(WebSocketTransportInterface $user, WebSocketMessageInterface $msg)
{
$dataIn = Zend_Json::decode($msg->getData());
switch ($dataIn['type']) {
case 'test1':
$test1 = new Cli_Model_Test1();
$test1->start();
echo 'END';
break;
case 'test2':
$test2 = new Cli_Model_Test2();
$test2->start();
break;
}
}
}
Это класс Cli_Model_Test1:
class Cli_Model_Test1 extends Thread
{
public function run()
{
for ($i = 0; $i < 10; $i++) {
sleep(10);
echo 1;
}
}
}
и это класс Cli_Model_Test2:
class Cli_Model_Test2 extends Thread
{
public function run()
{
echo 2;
}
}
Таким образом, основное поведение должно состоять в том, что когда я отправляю сообщение из браузера с типом ‘test1’, это должно вызвать поток test1, а когда я посылаю сообщение с ‘type2’, это должно запускать поток test2. И это работает так, но поток test1 блокирует метод onMessage, и все отправленные сообщения ожидают в очереди. Это происходит до конца цикла for внутри потока test1.
Это вывод сервера WebSocket:
2016-11-27T20:31:03+01:00 NOTICE (5): phpws listening on tcp://127.0.0.1:8080
2016-11-27T20:31:03+01:00 DEBUG (7): Got an HYBI style request, sent HYBY handshake response
2016-11-27T20:31:03+01:00 NOTICE (5): Added client connection-583b347776c42 to Cli_TestHandler
END 20:33:38
1 19:33:48
1 19:33:58
1 19:34:08
1 19:34:18
1 19:34:28
1 19:34:38
1 19:34:48
1 19:34:58
1 19:35:08
1 19:35:18
2 19:35:18
Почему onMessage заблокирован?
Задача ещё не решена.
Других решений пока нет …