How to save data realtime when run websocket by ratchet

I create chat realtime with ratchet. I can sent realtime messages to clients, but when I want save data on Function onMessage(), it has errors.
class WebsocketController extends AppController implements MessageComponentInterface

  • Function onMessage():
    public function onMessage(ConnectionInterface $from, $msg)
        {
        $numRecv = count($this->clients) - 1;
        $data = json_decode($msg, true);
        echo sprintf('Connection %d sending message "%s" to %d other connection%s' . "\n",$from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's');

        $this->loadModel('tFeed');
        $message = $this->tFeed->newEntity($data);
        $this->tFeed->save($message);

        foreach ($this->clients as $client) {
            $client->send($msg);
        }
    }

When I use loadModel() to start save data to db then Error start:

PS E:\Xampp\htdocs> php ./bin/chat-server.php
New connection! (113)
Connection 113 sending message "{"name":"Test","msg":"ok, thanks"}" to 0 other connections
PHP Fatal error:  Uncaught TypeError: rtrim(): Argument #1 ($string) must be of type string, null given in E:\Xampp\htdocs\vendor\cakephp\cakephp\src\Core\App.php:63
Stack trace:
#0 E:\Xampp\htdocs\vendor\cakephp\cakephp\src\Core\App.php(63): rtrim(NULL, '\\')
#1 E:\Xampp\htdocs\vendor\cakephp\cakephp\src\ORM\Locator\TableLocator.php(291): Cake\Core\App::className('tFeed', 'Model/Table', 'Table')
#2 E:\Xampp\htdocs\vendor\cakephp\cakephp\src\ORM\Locator\TableLocator.php(227): Cake\ORM\Locator\TableLocator->_getClassName('tFeed', Array)
#3 E:\Xampp\htdocs\vendor\cakephp\cakephp\src\Datasource\Locator\AbstractLocator.php(62): Cake\ORM\Locator\TableLocator->createInstance('tFeed', Array)
#4 E:\Xampp\htdocs\vendor\cakephp\cakephp\src\ORM\Locator\TableLocator.php(205): Cake\Datasource\Locator\AbstractLocator->get('tFeed', Array)
#5 E:\Xampp\htdocs\vendor\cakephp\cakephp\src\Datasource\ModelAwareTrait.php(122): Cake\ORM\Locator\TableLocator->get('tFeed', Array)
#6 E:\Xampp\htdocs\src\Controller\WebSocketController.php(31): Cake\Controller\Controller->loadModel('tFeed')
#7 E:\Xampp\htdocs\vendor\cboden\ratchet\src\Ratchet\WebSocket\WsServer.php(75): App\Controller\WebsocketController->onMessage(Object(Ratchet\WebSocket\WsConnection), '{"name":"L\xC3\xAA Xu...')
#8 E:\Xampp\htdocs\vendor\cboden\ratchet\src\Ratchet\WebSocket\WsServer.php(131): Ratchet\WebSocket\WsServer->Ratchet\WebSocket\{closure}(Object(Ratchet\WebSocket\WsConnection), Object(Ratchet\RFC6455\Messaging\Message))
#9 E:\Xampp\htdocs\vendor\ratchet\rfc6455\src\Messaging\MessageBuffer.php(248): Ratchet\WebSocket\WsServer->Ratchet\WebSocket\{closure}(Object(Ratchet\RFC6455\Messaging\Message), Object(Ratchet\RFC6455\Messaging\MessageBuffer))
#10 E:\Xampp\htdocs\vendor\ratchet\rfc6455\src\Messaging\MessageBuffer.php(194): Ratchet\RFC6455\Messaging\MessageBuffer->processData('\x81\xA3\x15\xFDX\xABn\xDF6\xCAx\x98z\x917...')
#11 E:\Xampp\htdocs\vendor\cboden\ratchet\src\Ratchet\WebSocket\WsServer.php(153): Ratchet\RFC6455\Messaging\MessageBuffer->onData('\x81\xA3\x15\xFDX\xABn\xDF6\xCAx\x98z\x917...')
#12 E:\Xampp\htdocs\vendor\cboden\ratchet\src\Ratchet\Http\HttpServer.php(54): Ratchet\WebSocket\WsServer->onMessage(Object(Ratchet\Server\IoConnection), '\x81\xA3\x15\xFDX\xABn\xDF6\xCAx\x98z\x917...')
#13 E:\Xampp\htdocs\vendor\cboden\ratchet\src\Ratchet\Server\IoServer.php(112): Ratchet\Http\HttpServer->onMessage(Object(Ratchet\Server\IoConnection), '\x81\xA3\x15\xFDX\xABn\xDF6\xCAx\x98z\x917...')
#14 E:\Xampp\htdocs\vendor\cboden\ratchet\src\Ratchet\Server\IoServer.php(95): Ratchet\Server\IoServer->handleData('\x81\xA3\x15\xFDX\xABn\xDF6\xCAx\x98z\x917...', Object(React\Socket\Connection))
#15 E:\Xampp\htdocs\vendor\evenement\evenement\src\Evenement\EventEmitterTrait.php(123): Ratchet\Server\IoServer->Ratchet\Server\{closure}('\x81\xA3\x15\xFDX\xABn\xDF6\xCAx\x98z\x917...')
#16 E:\Xampp\htdocs\vendor\react\stream\src\Util.php(71): Evenement\EventEmitter->emit('data', Array)
#17 E:\Xampp\htdocs\vendor\evenement\evenement\src\Evenement\EventEmitterTrait.php(123): React\Stream\Util::React\Stream\{closure}('\x81\xA3\x15\xFDX\xABn\xDF6\xCAx\x98z\x917...')
#18 E:\Xampp\htdocs\vendor\react\stream\src\DuplexResourceStream.php(196): Evenement\EventEmitter->emit('data', Array)
#19 E:\Xampp\htdocs\vendor\react\event-loop\src\StreamSelectLoop.php(245): React\Stream\DuplexResourceStream->handleData(Resource id #113)
#20 E:\Xampp\htdocs\vendor\react\event-loop\src\StreamSelectLoop.php(212): React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)
#21 E:\Xampp\htdocs\vendor\cboden\ratchet\src\Ratchet\Server\IoServer.php(74): React\EventLoop\StreamSelectLoop->run()
#22 E:\Xampp\htdocs\bin\chat-server.php(18): Ratchet\Server\IoServer->run()
#23 {main}
    thrown in E:\Xampp\htdocs\vendor\cakephp\cakephp\src\Core\App.php on line 63

The error tells that the model tFeed doesn’t exists. Does that line works on controllers?

Also note that $this->tFeed->save($message); can return false, handle that or use saveOrFail (and catch the exception)

I used it with ChatController.php. Name Model is true. I tried with $this->getTableLocator() but system gives same error

Are you requiring the config/bootstrap.php here? It is necesary sinces it loads the config (eg. the database connection)

1 Like

Thank you very much. <3