There are a few different options you have when creating a WAMP (Web Application Messaging Protocol) client with Thruway.
Option 1 is to use the Connection object provided with Thruway. This object was meant to ease the transition for those people familiar with simple use of the AutobahnJS Connection object. There is an example of this in the sources here.
Option 2 is to use the Thruway Client object as is – hooking into it with event handlers. There is an example of this in the sources here.
Option 3 is to subclass the Client object. That is what I am going to cover in this post.
Which option you chose would probably be a stylistic choice, or maybe what you are most comfortable with.
For this example, I will walk you through building a client that will allow querying free filesystem space via WAMP.
To get started, follow the instructions in the readme. There is no need to start the server as it instructs at the end of the installation. This example will use the thruway demo server so you don’t have to worry about that end.
You should be in the thruway directory now.
We are going to create two files: FreeSpaceClient.php, which will contain our subclass of Client, and StartClient.php, which will be used to start the Client.
First the FreeSpaceClient.
Create the FreeSpaceClient.php file and then copy and paste this into it:
This just requires the autoloader so PHP can find our classes and sets up the new class for us to work in.
Make the method that is going to be our RPC call:
public function getFreeSpace() { return array(disk_free_space('/')); // use c: for you windowers }Note that all RPCs must return arrays. They can be arrays of object but it must be an array.
We wire up our RPC in the onSessionStart by overriding it. Add this method to your class:
public function onSessionStart($session, $transport) { }Inside this method we will register our RPC call by adding:
$this->getCallee()->register($session, 'com.example.getfreespace', array($this, 'getFreeSpace'));This is it for our client object.
Create a new file StartClient.php that will bootstrap our client:
addTransportProvider(new \Thruway\Transport\PawlTransportProvider('ws://demo.thruway.ws:9090/')); $client->start();Now you can run the client and it should connect to the demo server and join the myrealm realm (you may want to change this if you run into other people trying this example).
I have created a plunker for you to test your creation here.
Latest posts by Matt Bonneau (see all)
- Limiting Concurrent Subscriptions With Rx - October 18, 2017
- Authorization/Permissions with Thruway - November 5, 2015
- Integrating Symfony Authentication for ThruwayBundle - June 22, 2015
The example above works fine with the example server (SimpleWsServer.php) but if I try to use Crossbar.io (0.9.9) the PHP RPC handler keeps disconnecting and reconnecting, and I don’t get the result back to the caller.
Is it meant to be compatible? I see the same occur for any RPC with Thruway / Crossbar.io. Any suggestions? Thanks
Hi Steve,
This example should work fine with crossbar. To make sure, I installed the crossbar php example (which uses Thruway) and replaced the client in there with this one.
I did have to make a few changes: the URL I had to change to “ws://127.0.0.1:8080/ws” and the realm I had to change to “realm1”. I made this change in both plunkr and the php client and was able to see the disk space free on my system.
The constant reconnecting is likely due to this as the default client will try to reconnect whenever a connection is lost.
Let me know if this helps or if you still can’t get it going.
Matt
Hi
Thanks for your prompt reply. I tried the crossbar PHP example again (entirely untouched) and it does the same – i.e. the guest process closes its connection and so takes down the crossbar broker as soon as I open the web page (localhost:8080).
I’ve not modified crossbar or the PHP example at all… I’ll keep digging to see if I can see what’s up.
Steve
Steve,
There might be an issue with the php crossbar example. Would you be able to replace the client example code with the code found here:
https://github.com/voryx/Thruway/issues/35#issuecomment-58100562
If that works, can you let me know what OS and PHP version you’re using?
Dave
Hi Dave
Sorry it’s been a while – I’ve been tied up on other things- but I tried your example and it works OK now. That said, the original example now also works. (my updated crossbar installation now says 0.9.11 so something must have been fixed in there.)
Thanks
FYI – OS is Xubuntu (3.13.0-39-generic) and PHP is 5.5.9-1ubuntu4.5
What is the recommended way to close a client connection? I have a Laravel controller that opens a client connection to the WS server, publishes a message to a channel and should then disconnect.
I assume I should close the client right away since the Laravel session doesn’t remain active. I’m currently trying $session->close(), but I’d like to know if that’s the “proper” way.
If you are trying to do a one-off publish from synchronous code, you will need to close the client or your script will hang until something causes it to disconnect from the router (or some script timeout maybe).
Check out this comment here: https://github.com/voryx/Thruway/issues/42#issuecomment-59791963
The close method is called in here once there is a successful publish or an error.