This CakePHP 3 plugin gives you an easy way to add websocket capability to your web application.
- CakePHP 3.3 or higher
- PHP 7.1
Note: You can checkout our CakePHP App Template for testing it on a clean app setup with preinstalled dependencies.
Example for websocket_events.php
...
'userDataUpdated' => [
'audience' => [
'includeAllNotAuthenticated' => false,
'includeAllAuthenticated' => true
]
]
...
Example for UsersController.php
...
use Websocket\Lib\Websocket;
...
if ($this->Users->save($exampleUser)) {
Websocket::publishEvent('userDataUpdated', ['editedUserId' => $exampleUser->id]);
}
...
Example for ../users/index_controller.js
...
App.Websocket.onEvent('userDataUpdated', function(payload) {
if (payload.editedUserId === this.exampleUser.id) {
alert('Someone changed the data of this user!');
}
}.bind(this));
...
$ bin/cake websocket_server
You can install this plugin into your CakePHP application using composer.
The recommended way to install composer packages is:
composer require scherersoftware/cake-websocket
The next step is to load the plugin properly inside your bootstrap.php:
Plugin::load('Websocket', ['bootstrap' => true, 'routes' => true]);
-
File:
/config/app.php
<?php ... 'Websocket' => [ 'ssl' => false, 'host' => '127.0.0.1', 'externalHost' => 'cws.dev', 'port' => 8889, 'frontendPath' => [ 'ssl' => [ 'path' => '/wss/', 'usePort' => false ], 'normal' => [ 'path' => '/', 'usePort' => true ] ], 'sessionCookieName' => 'cws', 'Queue' => [ 'name' => 'websocket', 'loopInterval' => 0.1, ] ] ...
-
File:
/config/websocket_events.php
<?php return [ 'userDataUpdated' => [ 'audience' => [ 'includeAllNotAuthenticated' => false, 'includeAllAuthenticated' => true ] ] ];
In your src/Controller/AppController.php
, insert the following pieces of code
Usage:
use Websocket\Lib\Websocket;
beforeFilter():
...
$this->FrontendBridge->setJson('websocketFrontendConfig', Websocket::getFrontendConfig());
...
- Load the file /webroot/lib/websocket.js after loading the Frontend Bridge assets
Please follow the Cake Sessions Documentation
Make sure these modules are activated:
- mod_proxy.so
- mod_proxy_wstunnel.so
Edit your vhosts configuration and add this to the ssl section:
ProxyPass /wss/ ws://localhost:8889/
- Unit Tests
- Add a websocket_connections table which stores all active connections