Thruway - an open source client and router implementation of WAMP (Web Application Messaging Protocol), for PHP.

Related tags

Routers Thruway
Overview

Build Status

Thruway

Thruway is an open source client and router implementation of WAMP (Web Application Messaging Protocol), for PHP. Thruway uses an event-driven, non-blocking I/O model (reactphp), perfect for modern real-time applications.

Supported WAMP Features

Basic Spec read more

  • Publish and Subscribe
  • Remote Procedure Calls
  • Websocket Transport
  • Internal Transport*
  • JSON serialization

Advanced Spec read more

  • RawSocket Transport
  • Authentication
  • WAMP Challenge-Response Authentication
  • Custom Authentication Methods
  • Authorization
  • Publish & Subscribe
  • Subscriber Black and Whitelisting
  • Publisher Exclusion
  • Publisher Identification
  • Subscriber Meta Events
  • Event History*
  • Subscription Matching
  • Prefix matching
  • Remote Procedure Calls
  • Caller Identification
  • Progressive Call Results
  • Distributed Registrations & Calls*
  • Caller Exclusion
  • Canceling Calls

* Thruway specific features

Requirements

Thruway is only supported on PHP 5.6 and up.

Quick Start with Composer

Create a directory for the test project

  $ mkdir thruway

Switch to the new directory

  $ cd thruway

Download Composer more info

  $ curl -sS https://getcomposer.org/installer | php

Download Thruway and dependencies

  $ php composer.phar require voryx/thruway

If you're going to also use the Thruway Client install a client transport. You'll need this to run the examples

  $ php composer.phar require thruway/pawl-transport

Start the WAMP router

  $ php vendor/voryx/thruway/Examples/SimpleWsRouter.php

Thruway is now running on 127.0.0.1 port 9090

PHP Client Example

addTransportProvider(new PawlTransportProvider("ws://127.0.0.1:9090/")); $client->on('open', function (ClientSession $session) { // 1) subscribe to a topic $onevent = function ($args) { echo "Event {$args[0]}\n"; }; $session->subscribe('com.myapp.hello', $onevent); // 2) publish an event $session->publish('com.myapp.hello', ['Hello, world from PHP!!!'], [], ["acknowledge" => true])->then( function () { echo "Publish Acknowledged!\n"; }, function ($error) { // publish failed echo "Publish Error {$error}\n"; } ); // 3) register a procedure for remoting $add2 = function ($args) { return $args[0] + $args[1]; }; $session->register('com.myapp.add2', $add2); // 4) call a remote procedure $session->call('com.myapp.add2', [2, 3])->then( function ($res) { echo "Result: {$res}\n"; }, function ($error) { echo "Call Error: {$error}\n"; } ); }); $client->start();">


require __DIR__ . '/vendor/autoload.php';

use Thruway\ClientSession;
use Thruway\Peer\Client;
use Thruway\Transport\PawlTransportProvider;

$client = new Client("realm1");
$client->addTransportProvider(new PawlTransportProvider("ws://127.0.0.1:9090/"));

$client->on('open', function (ClientSession $session) {

    // 1) subscribe to a topic
    $onevent = function ($args) {
        echo "Event {$args[0]}\n";
    };
    $session->subscribe('com.myapp.hello', $onevent);

    // 2) publish an event
    $session->publish('com.myapp.hello', ['Hello, world from PHP!!!'], [], ["acknowledge" => true])->then(
        function () {
            echo "Publish Acknowledged!\n";
        },
        function ($error) {
            // publish failed
            echo "Publish Error {$error}\n";
        }
    );

    // 3) register a procedure for remoting
    $add2 = function ($args) {
        return $args[0] + $args[1];
    };
    $session->register('com.myapp.add2', $add2);

    // 4) call a remote procedure
    $session->call('com.myapp.add2', [2, 3])->then(
        function ($res) {
            echo "Result: {$res}\n";
        },
        function ($error) {
            echo "Call Error: {$error}\n";
        }
    );
});


$client->start();

Javascript Clients

You can also use AutobahnJS or any other WAMPv2 compatible client.

Here are some [examples] (https://github.com/tavendo/AutobahnJS#show-me-some-code)

Here's a plunker that will allow you to run some tests against a local router

For AngularJS on the frontend, use the Angular WAMP wrapper.

Comments
  • Why RPC calls are so slow?

    Why RPC calls are so slow?

    I was interested what will be the time of calling trivial function with Thruway on local machine(Intel i7, SSD, Win 10x64, PHP 5.6).

    So I disabled all logs and outputs, started scripts from CLI, and I was very surprised with results:

    router.php

    use Thruway\Peer\Router;
    use Thruway\Transport\RatchetTransportProvider;
    
    $router = new Router();
    $transportProvider = new RatchetTransportProvider("127.0.0.1", 9090);
    $router->addTransportProvider($transportProvider);
    $router->start();
    

    client_ping.php

    use Thruway\ClientSession;
    use Thruway\Peer\Client;
    use Thruway\Transport\PawlTransportProvider;
    
    Thruway\Logging\Logger::set(new Psr\Log\NullLogger());
    
    $client = new Client("realm1");
    $client->addTransportProvider(new PawlTransportProvider("ws://127.0.0.1:9090/"));
    $client->on('open', function (ClientSession $session) {
        for($i = 0; $i < 30; $i++) {
            $session->call('func', [microtime(true)])->then(
                function ($start) {
                    $time = microtime(true) - (string)$start;
                    echo "Time: $time\n";
                },
                function ($error) {
                    echo "Call Error: {$error}\n";
                }
            );
        }
    });
    $client->start();
    

    client_pong.php

    use Thruway\ClientSession;
    use Thruway\Peer\Client;
    use Thruway\Transport\PawlTransportProvider;
    
    Thruway\Logging\Logger::set(new Psr\Log\NullLogger());
    
    $client = new Client("realm1");
    $client->addTransportProvider(new PawlTransportProvider("ws://127.0.0.1:9090/"));
    $client->on('open', function (ClientSession $session) {
        $session->register('func', function ($args) {
            return $args[0];
        });
    });
    $client->start();
    

    Results

    Time: 0.02100920677185059
    Time: 0.01913905143737793
    Time: 0.01973581314086914
    Time: 0.02045106887817383
    Time: 0.02109289169311523
    Time: 0.02178597450256348
    Time: 0.02236199378967285
    Time: 0.02300190925598145
    Time: 0.02365303039550781
    Time: 0.02436494827270508
    Time: 0.0250709056854248
    Time: 0.02570605278015137
    Time: 0.02640104293823242
    Time: 0.02705502510070801
    Time: 0.02766609191894531
    Time: 0.02826905250549316
    Time: 0.02883100509643555
    Time: 0.0294349193572998
    Time: 0.03014111518859863
    Time: 0.03057718276977539
    Time: 0.03104710578918457
    Time: 0.03148818016052246
    Time: 0.03200292587280273
    Time: 0.03266501426696777
    Time: 0.03319597244262695
    Time: 0.03388500213623047
    Time: 0.03449392318725586
    Time: 0.03490591049194336
    Time: 0.03531002998352051
    Time: 0.03569793701171875
    

    Is it okay that:

    1. Fastest response time is 19ms?
    2. Response time is growing up?

    I tested on Linux machine and result was almost the same.

    opened by barbushin 24
  • Synchronous client?

    Synchronous client?

    I would like to publish to a topic in the php code that is run within an http request, and it would be great if I can just connect, publish and disconnect in a synchronous way. How would you do that?

    opened by adosaiguas 20
  • Session::abort called after we are authenticated

    Session::abort called after we are authenticated

    I've just gone in to production with Thruway, all is going well do far! Just having a weird error!

    I'm getting the error "Session::abort called after we are authenticated". Tracing it back on onMessage in Thruway\Peer\Router the message the client is sending is a Goodbye message, but for some reason the session has a realm of null. When that happens Thruway throws a wamp.error.unknown and thats when the error is thrown. This seems to be effecting some (not all) autobahn clients.

    I'm not sure how this could happen? I've not really had time to do any more investigation yet. Could it be someone who is quickly connecting then disconnecting before the session has been setup?

    opened by adamlc 19
  • No errors handling during connection

    No errors handling during connection

    Hi everyone,

    I have a problem with a php client from your examples.

    When I try to connect to server with disabled ws routing then client is frozen and debug shows info: "[Thruway\Transport\PawlTransportProvider 1156] Starting Transport". It does not show any error, just hangs. The same situation is when connection is closed (disconnected). The connection will not be restored.

    bug 
    opened by msztorc 18
  • MapReduce

    MapReduce

    I'm having trouble trying to implement MapReduce with Thruway.

    From a high level, I'm looking to issue 100 requests and I want 100 responses.

    I'm trying to create 100 clients on the same loop that each subscribe on their own topic. When I start the loop, the clients will make a post to one of my web servers. The web server then does the requested work, fires up a client and publishes the completed work on the same topic that the requesting client is listening on.

    When I do this with 100 clients, about 90 of the clients get the desired responses and the rest just hang. I can see that 100 web requests were made, 100 jobs completed, and 100 new clients started up to publish their completed work. However, about 10 of the requesting clients do not receive responses on their topic.

    When I run this with 10 clients, it works. I have tested running it over 1000 times with 10 clients, and every single client gets a response every time.

    How do I figure out why some clients are not receiving their responses? Is there a TTL so I can set the clients to retry? Is there a maximum amount of topics that a router can handle concurrently? Is there a maximum amount of messages a router can handle conccurrently? Is this a memory issue?

    opened by MikeSWelch 18
  • Disconnect issue while using MDWamp client library

    Disconnect issue while using MDWamp client library

    Can you please help me to determine why I get an assertion error while using Thruway WAMP router with MDWamp client library on disconnect. I even do not understand is this issue related to MDWamp library or Thruway router library. Thats why I created the ticket here and I'll create the ticket in MDWamp client repo too. It is also possible that the issue I have experiencing is related with incorrect low level protocol implementation in server-side/client websocket library that Thruway/MDWamp (Ratchet/SocketRocket) uses, but I have no appropriate skills to determine what is wrong in this case.

    For explain the issue in simple way I just created the simple iOS app that you can run and start to debug. Here is the repo that contains iOS workspace sources, the latest thruway router sources. It also contain crossbar router config.json with same simple router configuration.

    When I use thruway router and I call mdwap.disconnect() I got assertion fail error: Assertion failed: (mapped_size >= sizeof(_currentReadMaskOffset) + offset), function __33-[SRWebSocket _readFrameContinue]_block_invoke_2, file /Test MDWamp with Thruway Router/Pods/SocketRocket/SocketRocket/SRWebSocket.m, line 1128.

    When I use crossbar router there is no such issue.

    However I tried to use both Thruway and Crossbar routers in my web app using 'angular-wamp' library on client side and there are no any issues on disconnect while using either Thruway or Crossbar router.

    Thank you.

    opened by zarv1k 15
  • Uncaught InvalidAccessError: Failed to execute 'close' on 'WebSocket': The code must be either 1000, or between 3000 and 4999. 1002 is neither.

    Uncaught InvalidAccessError: Failed to execute 'close' on 'WebSocket': The code must be either 1000, or between 3000 and 4999. 1002 is neither.

    All attempts to fix using solutions from existing issues has not succeeded.

    Server

    • Windows 7 x64
    • Intel i7-4810MQ

    PHP Info

    phpinfo()
    PHP Version => 5.6.6
    
    System => CYGWIN_NT-6.1-WOW TPEB19FK32 1.7.34(0.285/5/3) 2015-02-04 20:59 i686
    Build Date => Feb 25 2015 13:49:33
    Server API => Command Line Interface
    Virtual Directory Support => disabled
    Configuration File (php.ini) Path => /etc/php5
    Loaded Configuration File => /etc/php5/php.ini
    Scan this dir for additional .ini files => /etc/php5/conf.d
    Additional .ini files parsed => /etc/php5/conf.d/bz2.ini,
    /etc/php5/conf.d/ctype.ini,
    /etc/php5/conf.d/curl.ini,
    /etc/php5/conf.d/json.ini,
    /etc/php5/conf.d/mbstring.ini,
    /etc/php5/conf.d/mcrypt.ini,
    /etc/php5/conf.d/memcache.ini,
    /etc/php5/conf.d/mssql.ini,
    /etc/php5/conf.d/mysql.ini,
    /etc/php5/conf.d/mysqli.ini,
    /etc/php5/conf.d/pdo_dblib.ini,
    /etc/php5/conf.d/pdo_mysql.ini,
    /etc/php5/conf.d/phalcon.ini,
    /etc/php5/conf.d/phar.ini,
    /etc/php5/conf.d/sqlite3.ini,
    /etc/php5/conf.d/zlib.ini,
    /etc/php5/conf.d/zmq.ini
    
    PHP API => 20131106
    PHP Extension => 20131226
    Zend Extension => 220131226
    Zend Extension Build => API220131226,NTS
    PHP Extension Build => API20131226,NTS
    Debug Build => no
    Thread Safety => disabled
    Zend Signal Handling => disabled
    Zend Memory Manager => enabled
    Zend Multibyte Support => provided by mbstring
    IPv6 Support => enabled
    DTrace Support => disabled
    
    Registered PHP Streams => https, ftps, php, file, glob, data, http, ftp, compress.bzip2, compress.zlib, phar
    Registered Stream Socket Transports => tcp, udp, unix, udg, ssl, sslv3, sslv2, tls, tlsv1.0, tlsv1.1, tlsv1.2
    Registered Stream Filters => string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, dechunk, bzip2.*, mcrypt.*, mdecrypt.*, zlib.*
    
    This program makes use of the Zend Scripting Language Engine:
    Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
    
    
     _______________________________________________________________________
    
    
    Configuration
    
    bz2
    
    BZip2 Support => Enabled
    Stream Wrapper support => compress.bzip2://
    Stream Filter support => bzip2.decompress, bzip2.compress
    BZip2 Version => 1.0.6, 6-Sept-2010
    
    Core
    
    PHP Version => 5.6.6
    
    Directive => Local Value => Master Value
    allow_url_fopen => On => On
    allow_url_include => Off => Off
    always_populate_raw_post_data => 0 => 0
    arg_separator.input => & => &
    arg_separator.output => & => &
    asp_tags => Off => Off
    auto_append_file => no value => no value
    auto_globals_jit => On => On
    auto_prepend_file => no value => no value
    browscap => no value => no value
    default_charset => UTF-8 => UTF-8
    default_mimetype => text/html => text/html
    disable_classes => no value => no value
    disable_functions => no value => no value
    display_errors => Off => Off
    display_startup_errors => Off => Off
    doc_root => no value => no value
    docref_ext => no value => no value
    docref_root => no value => no value
    enable_dl => Off => Off
    enable_post_data_reading => On => On
    error_append_string => no value => no value
    error_log => no value => no value
    error_prepend_string => no value => no value
    error_reporting => 22527 => 22527
    exit_on_timeout => Off => Off
    expose_php => On => On
    extension_dir => /usr/lib/php/20131226 => /usr/lib/php/20131226
    file_uploads => On => On
    highlight.comment => <font style="color: #FF8000">#FF8000</font> => <font style="color: #FF8000">#FF8000</font>
    highlight.default => <font style="color: #0000BB">#0000BB</font> => <font style="color: #0000BB">#0000BB</font>
    highlight.html => <font style="color: #000000">#000000</font> => <font style="color: #000000">#000000</font>
    highlight.keyword => <font style="color: #007700">#007700</font> => <font style="color: #007700">#007700</font>
    highlight.string => <font style="color: #DD0000">#DD0000</font> => <font style="color: #DD0000">#DD0000</font>
    html_errors => Off => Off
    ignore_repeated_errors => Off => Off
    ignore_repeated_source => Off => Off
    ignore_user_abort => Off => Off
    implicit_flush => On => On
    include_path => .:/usr/share/pear:/usr/share/php/php => .:/usr/share/pear:/usr/share/php/php
    input_encoding => no value => no value
    internal_encoding => no value => no value
    log_errors => On => On
    log_errors_max_len => 1024 => 1024
    mail.add_x_header => On => On
    mail.force_extra_parameters => no value => no value
    mail.log => no value => no value
    max_execution_time => 0 => 0
    max_file_uploads => 20 => 20
    max_input_nesting_level => 64 => 64
    max_input_time => -1 => -1
    max_input_vars => 1000 => 1000
    memory_limit => 128M => 128M
    open_basedir => no value => no value
    output_buffering => 0 => 0
    output_encoding => no value => no value
    output_handler => no value => no value
    post_max_size => 8M => 8M
    precision => 16 => 16
    realpath_cache_size => 16K => 16K
    realpath_cache_ttl => 120 => 120
    register_argc_argv => On => On
    report_memleaks => On => On
    report_zend_debug => Off => Off
    request_order => GP => GP
    sendmail_from => no value => no value
    sendmail_path => /usr/sbin/sendmail -t -i  => /usr/sbin/sendmail -t -i 
    serialize_precision => 17 => 17
    short_open_tag => Off => Off
    SMTP => localhost => localhost
    smtp_port => 25 => 25
    sql.safe_mode => Off => Off
    sys_temp_dir => no value => no value
    track_errors => Off => Off
    unserialize_callback_func => no value => no value
    upload_max_filesize => 2M => 2M
    upload_tmp_dir => no value => no value
    user_dir => no value => no value
    user_ini.cache_ttl => 300 => 300
    user_ini.filename => .user.ini => .user.ini
    variables_order => GPCS => GPCS
    xmlrpc_error_number => 0 => 0
    xmlrpc_errors => Off => Off
    zend.detect_unicode => On => On
    zend.enable_gc => On => On
    zend.multibyte => Off => Off
    zend.script_encoding => no value => no value
    
    ctype
    
    ctype functions => enabled
    
    curl
    
    cURL support => enabled
    cURL Information => 7.41.0
    Age => 3
    Features
    AsynchDNS => No
    CharConv => No
    Debug => Yes
    GSS-Negotiate => No
    IDN => Yes
    IPv6 => Yes
    krb4 => No
    Largefile => Yes
    libz => Yes
    NTLM => Yes
    NTLMWB => Yes
    SPNEGO => Yes
    SSL => Yes
    SSPI => No
    TLS-SRP => Yes
    Protocols => dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, ldaps, pop3, pop3s, rtsp, scp, sftp, smb, smbs, smtp, smtps, telnet, tftp
    Host => i686-pc-cygwin
    SSL Version => OpenSSL/1.0.1g
    ZLib Version => 1.2.7
    libSSH Version => libssh2/1.4.3
    
    date
    
    date/time support => enabled
    "Olson" Timezone Database Version => 0.system
    Timezone Database => internal
    Default timezone => America/Phoenix
    
    Directive => Local Value => Master Value
    date.default_latitude => 31.7667 => 31.7667
    date.default_longitude => 35.2333 => 35.2333
    date.sunrise_zenith => 90.583333 => 90.583333
    date.sunset_zenith => 90.583333 => 90.583333
    date.timezone => America/Phoenix => America/Phoenix
    
    dom
    
    DOM/XML => enabled
    DOM/XML API Version => 20031129
    libxml Version => 2.9.2
    HTML Support => enabled
    XPath Support => enabled
    XPointer Support => enabled
    Schema Support => enabled
    RelaxNG Support => enabled
    
    ereg
    
    Regex Library => System library enabled
    
    filter
    
    Input Validation and Filtering => enabled
    Revision => $Id: 86120bba568c551914a35636ec408f1e7e66af32 $
    
    Directive => Local Value => Master Value
    filter.default => unsafe_raw => unsafe_raw
    filter.default_flags => no value => no value
    
    hash
    
    hash support => enabled
    Hashing Engines => md2 md4 md5 sha1 sha224 sha256 sha384 sha512 ripemd128 ripemd160 ripemd256 ripemd320 whirlpool tiger128,3 tiger160,3 tiger192,3 tiger128,4 tiger160,4 tiger192,4 snefru snefru256 gost gost-crypto adler32 crc32 crc32b fnv132 fnv1a32 fnv164 fnv1a64 joaat haval128,3 haval160,3 haval192,3 haval224,3 haval256,3 haval128,4 haval160,4 haval192,4 haval224,4 haval256,4 haval128,5 haval160,5 haval192,5 haval224,5 haval256,5 
    
    json
    
    json support => enabled
    json version => 1.3.7
    JSON-C headers version => 0.11
    JSON-C library version => 0.11
    
    libxml
    
    libXML support => active
    libXML Compiled Version => 2.9.2
    libXML Loaded Version => 20902
    libXML streams => enabled
    
    mbstring
    
    Multibyte Support => enabled
    Multibyte string engine => libmbfl
    HTTP input encoding translation => disabled
    libmbfl version => 1.3.2
    
    mbstring extension makes use of "streamable kanji code filter and converter", which is distributed under the GNU Lesser General Public License version 2.1.
    
    Multibyte (japanese) regex support => enabled
    Multibyte regex (oniguruma) version => 5.9.3
    
    Directive => Local Value => Master Value
    mbstring.detect_order => no value => no value
    mbstring.encoding_translation => Off => Off
    mbstring.func_overload => 0 => 0
    mbstring.http_input => no value => no value
    mbstring.http_output => no value => no value
    mbstring.http_output_conv_mimetypes => ^(text/|application/xhtml\+xml) => ^(text/|application/xhtml\+xml)
    mbstring.internal_encoding => no value => no value
    mbstring.language => neutral => neutral
    mbstring.strict_detection => Off => Off
    mbstring.substitute_character => no value => no value
    
    mcrypt
    
    mcrypt support => enabled
    mcrypt_filter support => enabled
    Version => 2.5.8
    Api No => 20021217
    Supported ciphers => cast-128 gost rijndael-128 twofish arcfour cast-256 loki97 rijndael-192 saferplus wake blowfish-compat des rijndael-256 serpent xtea blowfish enigma rc2 tripledes 
    Supported modes => cbc cfb ctr ecb ncfb nofb ofb stream 
    
    Directive => Local Value => Master Value
    mcrypt.algorithms_dir => no value => no value
    mcrypt.modes_dir => no value => no value
    
    memcache
    
    memcache support => enabled
    Version => 3.0.8
    Revision => $Revision: 329835 $
    
    Directive => Local Value => Master Value
    memcache.allow_failover => 1 => 1
    memcache.chunk_size => 32768 => 32768
    memcache.compress_threshold => 20000 => 20000
    memcache.default_port => 11211 => 11211
    memcache.hash_function => crc32 => crc32
    memcache.hash_strategy => consistent => consistent
    memcache.lock_timeout => 15 => 15
    memcache.max_failover_attempts => 20 => 20
    memcache.protocol => ascii => ascii
    memcache.redundancy => 1 => 1
    memcache.session_redundancy => 2 => 2
    
    mhash
    
    MHASH support => Enabled
    MHASH API Version => Emulated Support
    
    mssql
    
    MSSQL Support => enabled
    Active Persistent Links => 0
    Active Links => 0
    Library version => FreeTDS
    
    Directive => Local Value => Master Value
    mssql.allow_persistent => On => On
    mssql.batchsize => 0 => 0
    mssql.charset => no value => no value
    mssql.compatability_mode => Off => Off
    mssql.compatibility_mode => Off => Off
    mssql.connect_timeout => 5 => 5
    mssql.datetimeconvert => On => On
    mssql.max_links => Unlimited => Unlimited
    mssql.max_persistent => Unlimited => Unlimited
    mssql.max_procs => Unlimited => Unlimited
    mssql.min_error_severity => 10 => 10
    mssql.min_message_severity => 10 => 10
    mssql.secure_connection => Off => Off
    mssql.textlimit => Server default => Server default
    mssql.textsize => Server default => Server default
    mssql.timeout => 60 => 60
    
    mysql
    
    MySQL Support => enabled
    Active Persistent Links => 0
    Active Links => 0
    Client API version => mysqlnd 5.0.11-dev - 20120503 - $Id: 3c688b6bbc30d36af3ac34fdd4b7b5b787fe5555 $
    
    Directive => Local Value => Master Value
    mysql.allow_local_infile => On => On
    mysql.allow_persistent => On => On
    mysql.connect_timeout => 60 => 60
    mysql.default_host => no value => no value
    mysql.default_password => no value => no value
    mysql.default_port => no value => no value
    mysql.default_socket => /var/run/mysql.sock => /var/run/mysql.sock
    mysql.default_user => no value => no value
    mysql.max_links => Unlimited => Unlimited
    mysql.max_persistent => Unlimited => Unlimited
    mysql.trace_mode => Off => Off
    
    mysqli
    
    MysqlI Support => enabled
    Client API library version => mysqlnd 5.0.11-dev - 20120503 - $Id: 3c688b6bbc30d36af3ac34fdd4b7b5b787fe5555 $
    Active Persistent Links => 0
    Inactive Persistent Links => 0
    Active Links => 0
    
    Directive => Local Value => Master Value
    mysqli.allow_local_infile => On => On
    mysqli.allow_persistent => On => On
    mysqli.default_host => no value => no value
    mysqli.default_port => 3306 => 3306
    mysqli.default_pw => no value => no value
    mysqli.default_socket => /var/run/mysql.sock => /var/run/mysql.sock
    mysqli.default_user => no value => no value
    mysqli.max_links => Unlimited => Unlimited
    mysqli.max_persistent => Unlimited => Unlimited
    mysqli.reconnect => Off => Off
    mysqli.rollback_on_cached_plink => Off => Off
    
    mysqlnd
    
    mysqlnd => enabled
    Version => mysqlnd 5.0.11-dev - 20120503 - $Id: 3c688b6bbc30d36af3ac34fdd4b7b5b787fe5555 $
    Compression => supported
    core SSL => supported
    extended SSL => supported
    Command buffer size => 4096
    Read buffer size => 32768
    Read timeout => 31536000
    Collecting statistics => Yes
    Collecting memory statistics => No
    Tracing => n/a
    Loaded plugins => mysqlnd,debug_trace,auth_plugin_mysql_native_password,auth_plugin_mysql_clear_password,auth_plugin_sha256_password
    API Extensions => mysql,mysqli,pdo_mysql
    
    mysqlnd statistics =>  
    bytes_sent => 0
    bytes_received => 0
    packets_sent => 0
    packets_received => 0
    protocol_overhead_in => 0
    protocol_overhead_out => 0
    bytes_received_ok_packet => 0
    bytes_received_eof_packet => 0
    bytes_received_rset_header_packet => 0
    bytes_received_rset_field_meta_packet => 0
    bytes_received_rset_row_packet => 0
    bytes_received_prepare_response_packet => 0
    bytes_received_change_user_packet => 0
    packets_sent_command => 0
    packets_received_ok => 0
    packets_received_eof => 0
    packets_received_rset_header => 0
    packets_received_rset_field_meta => 0
    packets_received_rset_row => 0
    packets_received_prepare_response => 0
    packets_received_change_user => 0
    result_set_queries => 0
    non_result_set_queries => 0
    no_index_used => 0
    bad_index_used => 0
    slow_queries => 0
    buffered_sets => 0
    unbuffered_sets => 0
    ps_buffered_sets => 0
    ps_unbuffered_sets => 0
    flushed_normal_sets => 0
    flushed_ps_sets => 0
    ps_prepared_never_executed => 0
    ps_prepared_once_executed => 0
    rows_fetched_from_server_normal => 0
    rows_fetched_from_server_ps => 0
    rows_buffered_from_client_normal => 0
    rows_buffered_from_client_ps => 0
    rows_fetched_from_client_normal_buffered => 0
    rows_fetched_from_client_normal_unbuffered => 0
    rows_fetched_from_client_ps_buffered => 0
    rows_fetched_from_client_ps_unbuffered => 0
    rows_fetched_from_client_ps_cursor => 0
    rows_affected_normal => 0
    rows_affected_ps => 0
    rows_skipped_normal => 0
    rows_skipped_ps => 0
    copy_on_write_saved => 0
    copy_on_write_performed => 0
    command_buffer_too_small => 0
    connect_success => 0
    connect_failure => 0
    connection_reused => 0
    reconnect => 0
    pconnect_success => 0
    active_connections => 0
    active_persistent_connections => 0
    explicit_close => 0
    implicit_close => 0
    disconnect_close => 0
    in_middle_of_command_close => 0
    explicit_free_result => 0
    implicit_free_result => 0
    explicit_stmt_close => 0
    implicit_stmt_close => 0
    mem_emalloc_count => 0
    mem_emalloc_amount => 0
    mem_ecalloc_count => 0
    mem_ecalloc_amount => 0
    mem_erealloc_count => 0
    mem_erealloc_amount => 0
    mem_efree_count => 0
    mem_efree_amount => 0
    mem_malloc_count => 0
    mem_malloc_amount => 0
    mem_calloc_count => 0
    mem_calloc_amount => 0
    mem_realloc_count => 0
    mem_realloc_amount => 0
    mem_free_count => 0
    mem_free_amount => 0
    mem_estrndup_count => 0
    mem_strndup_count => 0
    mem_estndup_count => 0
    mem_strdup_count => 0
    proto_text_fetched_null => 0
    proto_text_fetched_bit => 0
    proto_text_fetched_tinyint => 0
    proto_text_fetched_short => 0
    proto_text_fetched_int24 => 0
    proto_text_fetched_int => 0
    proto_text_fetched_bigint => 0
    proto_text_fetched_decimal => 0
    proto_text_fetched_float => 0
    proto_text_fetched_double => 0
    proto_text_fetched_date => 0
    proto_text_fetched_year => 0
    proto_text_fetched_time => 0
    proto_text_fetched_datetime => 0
    proto_text_fetched_timestamp => 0
    proto_text_fetched_string => 0
    proto_text_fetched_blob => 0
    proto_text_fetched_enum => 0
    proto_text_fetched_set => 0
    proto_text_fetched_geometry => 0
    proto_text_fetched_other => 0
    proto_binary_fetched_null => 0
    proto_binary_fetched_bit => 0
    proto_binary_fetched_tinyint => 0
    proto_binary_fetched_short => 0
    proto_binary_fetched_int24 => 0
    proto_binary_fetched_int => 0
    proto_binary_fetched_bigint => 0
    proto_binary_fetched_decimal => 0
    proto_binary_fetched_float => 0
    proto_binary_fetched_double => 0
    proto_binary_fetched_date => 0
    proto_binary_fetched_year => 0
    proto_binary_fetched_time => 0
    proto_binary_fetched_datetime => 0
    proto_binary_fetched_timestamp => 0
    proto_binary_fetched_string => 0
    proto_binary_fetched_blob => 0
    proto_binary_fetched_enum => 0
    proto_binary_fetched_set => 0
    proto_binary_fetched_geometry => 0
    proto_binary_fetched_other => 0
    init_command_executed_count => 0
    init_command_failed_count => 0
    com_quit => 0
    com_init_db => 0
    com_query => 0
    com_field_list => 0
    com_create_db => 0
    com_drop_db => 0
    com_refresh => 0
    com_shutdown => 0
    com_statistics => 0
    com_process_info => 0
    com_connect => 0
    com_process_kill => 0
    com_debug => 0
    com_ping => 0
    com_time => 0
    com_delayed_insert => 0
    com_change_user => 0
    com_binlog_dump => 0
    com_table_dump => 0
    com_connect_out => 0
    com_register_slave => 0
    com_stmt_prepare => 0
    com_stmt_execute => 0
    com_stmt_send_long_data => 0
    com_stmt_close => 0
    com_stmt_reset => 0
    com_stmt_set_option => 0
    com_stmt_fetch => 0
    com_deamon => 0
    bytes_received_real_data_normal => 0
    bytes_received_real_data_ps => 0
    
    openssl
    
    OpenSSL support => enabled
    OpenSSL Library Version => OpenSSL 1.0.1g 7 Apr 2014
    OpenSSL Header Version => OpenSSL 1.0.1k 8 Jan 2015
    
    Directive => Local Value => Master Value
    openssl.cafile => no value => no value
    openssl.capath => no value => no value
    
    pcre
    
    PCRE (Perl Compatible Regular Expressions) Support => enabled
    PCRE Library Version => 8.36 2014-09-26
    
    Directive => Local Value => Master Value
    pcre.backtrack_limit => 1000000 => 1000000
    pcre.recursion_limit => 100000 => 100000
    
    PDO
    
    PDO support => enabled
    PDO drivers => dblib, mysql
    
    pdo_dblib
    
    PDO Driver for FreeTDS/Sybase DB-lib => enabled
    Flavour => freetds
    
    pdo_mysql
    
    PDO Driver for MySQL => enabled
    Client API version => mysqlnd 5.0.11-dev - 20120503 - $Id: 3c688b6bbc30d36af3ac34fdd4b7b5b787fe5555 $
    
    Directive => Local Value => Master Value
    pdo_mysql.default_socket => /var/run/mysql.sock => /var/run/mysql.sock
    
    phalcon
    
    Phalcon Framework => enabled
    Phalcon Version => 1.3.4
    
    Directive => Local Value => Master Value
    phalcon.db.escape_identifiers => On => On
    phalcon.orm.column_renaming => On => On
    phalcon.orm.enable_literals => On => On
    phalcon.orm.events => On => On
    phalcon.orm.exception_on_failed_save => Off => Off
    phalcon.orm.not_null_validations => On => On
    phalcon.orm.virtual_foreign_keys => On => On
    phalcon.register_psr3_classes => Off => Off
    
    Phar
    
    Phar: PHP Archive support => enabled
    Phar EXT version => 2.0.2
    Phar API version => 1.1.1
    SVN revision => $Id: 05b5216ba38b9756eda74ee8fdd986bb81712de1 $
    Phar-based phar archives => enabled
    Tar-based phar archives => enabled
    ZIP-based phar archives => enabled
    gzip compression => enabled
    bzip2 compression => enabled
    Native OpenSSL support => enabled
    
    
    Phar based on pear/PHP_Archive, original concept by Davey Shafik.
    Phar fully realized by Gregory Beaver and Marcus Boerger.
    Portions of tar implementation Copyright (c) 2003-2009 Tim Kientzle.
    Directive => Local Value => Master Value
    phar.cache_list => no value => no value
    phar.readonly => On => On
    phar.require_hash => On => On
    
    readline
    
    Readline Support => enabled
    Readline library => EditLine wrapper
    
    Directive => Local Value => Master Value
    cli.pager => no value => no value
    cli.prompt => \b \>  => \b \> 
    
    Reflection
    
    Reflection => enabled
    Version => $Id: eff8bdc65b0beaf8f4ade6f06f848e6d43dfd826 $
    
    session
    
    Session Support => enabled
    Registered save handlers => files user memcache 
    Registered serializer handlers => php_serialize php php_binary 
    
    Directive => Local Value => Master Value
    session.auto_start => Off => Off
    session.cache_expire => 180 => 180
    session.cache_limiter => nocache => nocache
    session.cookie_domain => no value => no value
    session.cookie_httponly => Off => Off
    session.cookie_lifetime => 0 => 0
    session.cookie_path => / => /
    session.cookie_secure => Off => Off
    session.entropy_file => /dev/urandom => /dev/urandom
    session.entropy_length => 32 => 32
    session.gc_divisor => 1000 => 1000
    session.gc_maxlifetime => 1440 => 1440
    session.gc_probability => 1 => 1
    session.hash_bits_per_character => 5 => 5
    session.hash_function => 0 => 0
    session.name => PHPSESSID => PHPSESSID
    session.referer_check => no value => no value
    session.save_handler => files => files
    session.save_path => no value => no value
    session.serialize_handler => php => php
    session.upload_progress.cleanup => On => On
    session.upload_progress.enabled => On => On
    session.upload_progress.freq => 1% => 1%
    session.upload_progress.min_freq => 1 => 1
    session.upload_progress.name => PHP_SESSION_UPLOAD_PROGRESS => PHP_SESSION_UPLOAD_PROGRESS
    session.upload_progress.prefix => upload_progress_ => upload_progress_
    session.use_cookies => On => On
    session.use_only_cookies => On => On
    session.use_strict_mode => Off => Off
    session.use_trans_sid => 0 => 0
    
    SPL
    
    SPL support => enabled
    Interfaces => Countable, OuterIterator, RecursiveIterator, SeekableIterator, SplObserver, SplSubject
    Classes => AppendIterator, ArrayIterator, ArrayObject, BadFunctionCallException, BadMethodCallException, CachingIterator, CallbackFilterIterator, DirectoryIterator, DomainException, EmptyIterator, FilesystemIterator, FilterIterator, GlobIterator, InfiniteIterator, InvalidArgumentException, IteratorIterator, LengthException, LimitIterator, LogicException, MultipleIterator, NoRewindIterator, OutOfBoundsException, OutOfRangeException, OverflowException, ParentIterator, RangeException, RecursiveArrayIterator, RecursiveCachingIterator, RecursiveCallbackFilterIterator, RecursiveDirectoryIterator, RecursiveFilterIterator, RecursiveIteratorIterator, RecursiveRegexIterator, RecursiveTreeIterator, RegexIterator, RuntimeException, SplDoublyLinkedList, SplFileInfo, SplFileObject, SplFixedArray, SplHeap, SplMinHeap, SplMaxHeap, SplObjectStorage, SplPriorityQueue, SplQueue, SplStack, SplTempFileObject, UnderflowException, UnexpectedValueException
    
    sqlite3
    
    SQLite3 support => enabled
    SQLite3 module version => 0.7-dev
    SQLite Library => 3.8.8.3
    
    Directive => Local Value => Master Value
    sqlite3.extension_dir => no value => no value
    
    standard
    
    Dynamic Library Support => enabled
    Path to sendmail => /usr/sbin/sendmail -t -i 
    
    Directive => Local Value => Master Value
    assert.active => 1 => 1
    assert.bail => 0 => 0
    assert.callback => no value => no value
    assert.quiet_eval => 0 => 0
    assert.warning => 1 => 1
    auto_detect_line_endings => 0 => 0
    default_socket_timeout => 60 => 60
    from => no value => no value
    url_rewriter.tags => a=href,area=href,frame=src,input=src,form=fakeentry => a=href,area=href,frame=src,input=src,form=fakeentry
    user_agent => no value => no value
    
    xml
    
    XML Support => active
    XML Namespace Support => active
    libxml2 Version => 2.9.2
    
    zlib
    
    ZLib Support => enabled
    Stream Wrapper => compress.zlib://
    Stream Filter => zlib.inflate, zlib.deflate
    Compiled Version => 1.2.8
    Linked Version => 1.2.7
    
    Directive => Local Value => Master Value
    zlib.output_compression => Off => Off
    zlib.output_compression_level => -1 => -1
    zlib.output_handler => no value => no value
    
    zmq
    
    ZMQ extension => enabled
    ZMQ extension version => 1.1.2
    libzmq version => 2.2.0
    

    Autobahn.js Debugging Output

    AutobahnJS debug enabled
    autobahn.min.js:33 trying to create WAMP transport of type: websocket
    autobahn.min.js:33 using WAMP transport type: websocket
    autobahn.min.js:33 WebSocket transport send [1,"realm1",{"roles":{"caller":{"features":{"caller_identification":true,"progressive_call_results":true}},"callee":{"features":{"progressive_call_results":true}},"publisher":{"features":{"subscriber_blackwhite_listing":true,"publisher_exclusion":true,"publisher_identification":true}},"subscriber":{"features":{"publisher_identification":true}}}}]
    autobahn.min.js:33 WebSocket transport receive [2,799997369,{"roles":{"caller":{"features":{"caller_identification":true,"progressive_call_results":true}},"callee":{"features":{"progressive_call_results":true}},"publisher":{"features":{"subscriber_blackwhite_listing":true,"publisher_exclusion":true,"publisher_identification":true}},"subscriber":{"features":{"publisher_identification":true}},"broker":{"features":{"subscriber_blackwhite_listing":true,"publisher_exclusion":true,"subscriber_metaevents":true}}},"transport":{"type":"ratchet","transport_address":"192.168.120.33","headers":{"Host":["192.168.123.46:8082"],"Connection":["Upgrade"],"Pragma":["no-cache"],"Cache-Control":["no-cache"],"Upgrade":["websocket"],"Origin":["http:\/\/192.168.123.46:8080"],"Sec-WebSocket-Version":["13"],"User-Agent":["Mozilla\/5.0 (X11; Linux i686) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/42.0.2311.135 Safari\/537.36"],"Accept-Encoding":["gzip, deflate, sdch"],"Accept-Language":["en-US,en;q=0.8"],"Cookie":["PHPSESSID=u6uregsvfbjiak48f0banbg7i0"],"Sec-WebSocket-Key":["a32F0r3lTZFLGCHAlwPtiQ=="],"Sec-WebSocket-Extensions":["permessage-deflate; client_max_window_bits"],"Sec-WebSocket-Protocol":["wamp.2.json"],"Content-Length":[0]},"url":"http:\/\/192.168.123.46:8082\/","query_params":[],"cookies":{"PHPSESSID":"u6uregsvfbjiak48f0banbg7i0"}}}]
    angular.js:10264 Congrats!  You're connected to the WAMP server!
    autobahn.min.js:33 WebSocket transport send [32,4016700523544576,{},"com.myapp.hello"]
    autobahn.min.js:33 WebSocket transport receive [33,9.223372036854776e+18,360841284]
    autobahn.min.js:33 failing transport due to protocol violation: SUBSCRIBED received for non-pending request ID 9223372036854776000
    autobahn.min.js:115 Uncaught InvalidAccessError: Failed to execute 'close' on 'WebSocket': The code must be either 1000, or between 3000 and 4999. 1002 is neither.18.a.create.window.c.close @ autobahn.min.js:11516.f._protocol_violation @ autobahn.min.js:8316.f._process_SUBSCRIBED @ autobahn.min.js:8316.f._socket.onmessage @ autobahn.min.js:9418.a.create.window.b.onmessage @ autobahn.min.js:114
    angular.js:8644 XHR finished loading: GET "http://192.168.123.46:8080/sales/team/Orcas".b @ angular.js:8644t @ angular.js:8440$get.f @ angular.js:8160n.promise.then.J @ angular.js:11592n.promise.then.J @ angular.js:11592(anonymous function) @ angular.js:11678$get.h.$eval @ angular.js:12769$get.h.$digest @ angular.js:12573$get.h.$apply @ angular.js:12873(anonymous function) @ angular.js:14390e @ angular.js:4498(anonymous function) @ angular.js:4799
    autobahn.min.js:33 WebSocket transport send [16,3744199499317248,{},"com.myapp.hello",["Hello World"]]
    

    Thruway Debugging Output

    2015-05-14T12:39:51.3739970 debug      [Thruway\Transport\RatchetTransportProvider 17276] RatchetTransportProvider::onOpen
    Processing DOM_Tech...
    2015-05-14T12:39:51.4260020 debug      [Thruway\Transport\RatchetTransportProvider 17276] onMessage: ([1,"realm1",{"roles":{"caller":{"features":{"caller_identification":true,"progressive_call_results":true}},"callee":{"features":{"progressive_call_results":true}},"publisher":{"features":{"subscriber_blackwhite_listing":true,"publisher_exclusion":true,"publisher_identification":true}},"subscriber":{"features":{"publisher_identification":true}}}}])
    2015-05-14T12:39:51.4280020 info       [Thruway\RealmManager 17276] Got prehello...
    2015-05-14T12:39:51.4280020 debug      [Thruway\RealmManager 17276] Creating new realm "realm1"
    2015-05-14T12:39:51.4320020 debug      [Thruway\RealmManager 17276] Adding realm "realm1"
    2015-05-14T12:39:51.4320020 info       [Thruway\RealmManager 17276] Realm "realm1" is using ManagerDummy
    2015-05-14T12:39:51.4950090 debug      [Thruway\Transport\RatchetTransportProvider 17276] onMessage: ([32,4016700523544576,{},"com.myapp.hello"])
    2015-05-14T12:39:51.4970090 debug      [Thruway\Subscription\SubscriptionGroup 17276] Added subscription to "exact":"com.myapp.hello"2015-05-14T12:39:53.7642360 debug      [Thruway\Transport\RatchetTransportProvider 17276] onMessage: ([16,3744199499317248,{},"com.myapp.hello",["Hello World"]])
    
    opened by NeoVance 15
  • Ratchet push notifications equivalent

    Ratchet push notifications equivalent

    Hi, After spending days understanding this tutorial http://socketo.me/docs/push and applying it, I found out its for WAMP v1, and it's not supported anywhere!

    I'm trying hard to upgrade but all what I get is headache.

    1- Do I need to implement ZMQ while using Thruway/WAMP v2 to push notifications? 2- How to get cookies and user remote IP address? 3- How to implement onSubscribe? 4- is it possible to send data for a specific user as what I do on the following code? 5- is it bad to keep using WAMP V1? in case you couldn't help me out?

    pusherServer.php

    require dirname(__DIR__) . '/../vendor/autoload.php';
    
    $loop   = React\EventLoop\Factory::create();
    $pusher = new myAPP\src\pusher;
    
    // Listen for the web server to make a ZeroMQ push after an ajax request
    $context = new React\ZMQ\Context($loop);
    $pull = $context->getSocket(ZMQ::SOCKET_PULL);
    $pull->bind('tcp://127.0.0.1:5555'); // Binding to 127.0.0.1 means the only client that can connect is itself
    $pull->on('message', array($pusher, 'warnUserFunction'));
    
    // Set up our WebSocket server for clients wanting real-time updates
    $webSock = new React\Socket\Server('0.0.0.0:9999', $loop); // Binding to 0.0.0.0 means remotes can connect
    $webServer = new Ratchet\Server\IoServer(
        new Ratchet\Http\HttpServer(
            new Ratchet\WebSocket\WsServer(
                new Ratchet\Wamp\WampServer(
                    $pusher
                )
            )
        ),
        $webSock
    );
    
    $loop->run();
    
    

    pusher.php

    namespace myAPP\src;
    use Ratchet\ConnectionInterface;
    use Ratchet\Wamp\WampServerInterface;
    use myAPP\src\databaseConnection;
    
    class pusher implements WampServerInterface
    {
        protected $subscribedTopics = array();
        protected $connection;
        public function onSubscribe(ConnectionInterface $conn, $topic) {
        
            var_dump('connected');
            $cookiesHeader = $conn->httpRequest->getHeader('Cookie');
    
            if(count($cookiesHeader)) {
                $cookies = \GuzzleHttp\Psr7\parse_header($cookiesHeader)[0];
                if (array_key_exists('PHPSESSION', $cookies)) {
                    $dd = new databaseConnection();
                    $this->connection = $dd::$connection;
                    $key = filter_var($cookies['PHPSESSION'] , FILTER_SANITIZE_STRING);
                    $channel = filter_var($topic->getId() , FILTER_SANITIZE_STRING);
                    $this->connection->insert('connectionsHandler' , ['channel'=>$channel,'userIP'=>$conn->remoteAddress , 'cookieKey'=>$key , 'wampSessionID'=>$conn->wrappedConn->WAMP->sessionId]);
                    $this->subscribedTopics[$channel] = $topic;
                }
            }
    
        }
    
        public function onCall(ConnectionInterface $conn, $id, $topic, array $params) {
            // In this application if clients send data it's because the user hacked around in console
            $conn->callError($id, $topic, 'You are not allowed to make calls')->close();
        }
        public function onPublish(ConnectionInterface $conn, $topic, $event, array $exclude, array $eligible) {
            // In this application if clients send data it's because the user hacked around in console
            $conn->close();
        }
    
    
        public function warnUserFunction($data){
            $data = json_decode($data , true);
            if (!isset($data['category'])) return; 
            if (isset($data['specificWampSessionID'])){
    
                   foreach ($topic->getIterator() as $client) {
                    if ($client->wrappedConn->WAMP->sessionId != $data['specificWampSessionID']) continue;
                    $client->event($topic->getId(), $data);
                }
            }else{
    
            $topic = $this->subscribedTopics[$data['category']];
            $topic->broadcast($data);
            }
       
        }
    
    
    
    }
    
    

    publisher.php

    
    $entryData['category'] = 'test123';
    
    $entryData['data'] = ['test'=>'message'];
    $entryData['time'] = time();
    
    $context = new ZMQContext();
    $socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'my pusher');
    $socket->connect("tcp://127.0.0.1:5555");
    
    $socket->send(json_encode($entryData));
    
    opened by Moniiiiii 14
  • lost connection callback/event

    lost connection callback/event

    Hello guys. Have a question about whether a router can know when a client's connection is lost / closed? I need to add some functionality on the server side once browser is closed which indicates ws connection is closed. Thank you

    question 
    opened by evgenyfedorenko 14
  • OpenSSL error connecting to a crossbar server

    OpenSSL error connecting to a crossbar server

    Attempting to create a connection to the crossbar server located at wss://chat2.sturents.com:8089/ws I receive an Open SSL error.

    The code is:

    public static function getConnection($url, $realm, $user, $password, LoopInterface $loop = null){
        $onChallenge = function (ClientSession $session, $method, ChallengeMessage $msg) use ($user, $password){
            echo "Responding to challenge as user '$user' with password '$password'\n";
            if ("wampcra"!==$method){
                return false;
            }
    
            $cra = new ClientAuth($user, $password);
    
            return $cra->getAuthenticateFromChallenge($msg)->getSignature();
        };
    
        return new Connection([
            "realm" => $realm,
            "url" => $url,
            "authmethods" => ["wampcra"],
            "onChallenge" => $onChallenge,
            "authid" => $user,
        ], $loop);
    }
    

    The wampcra section does not get run, and the console output is:

    2016-01-29T15:45:44.9931680 notice     Changing PHP precision from 14 to 16
    2016-01-29T15:45:44.9932720 info       [Thruway\Peer\Client 16515] New client created
    Add on-open loop for subscribe: sr.push
    2016-01-29T15:45:44.9940140 info       [Thruway\Transport\PawlTransportProvider 16515] Starting Transport
    2016-01-29T15:45:45.0433140 info       [Thruway\Transport\PawlTransportProvider 16515] Could not connect: Unable to complete SSL/TLS handshake: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
    2016-01-29T15:45:46.5375480 info       [Thruway\Transport\PawlTransportProvider 16515] Starting Transport
    2016-01-29T15:45:46.5578840 info       [Thruway\Transport\PawlTransportProvider 16515] Could not connect: Unable to complete SSL/TLS handshake: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
    2016-01-29T15:45:48.8021020 info       [Thruway\Transport\PawlTransportProvider 16515] Starting Transport
    2016-01-29T15:45:48.8289650 info       [Thruway\Transport\PawlTransportProvider 16515] Could not connect: Unable to complete SSL/TLS handshake: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
    

    I can confirm that this is a working crossbar server, as it currently powers the live chat for the website https://sturents.com, which uses a JS implementation of WAMP with Autobahn. The design of this PHP version has been based on that Autobahn code. The crossbar server is also running two custom PHP listeners using Thruway and React, which are working as internal monitors and RPC providers.

    My composer.lock file is composer.txt

    opened by M1ke 13
  • Ratchet to Thruway conversion

    Ratchet to Thruway conversion

    Hi there,

    The code below is what I use from the Ratchet website: http://socketo.me/docs/push I've got it in a console command in my favorite framework and run it. After that I can connect, publish and subscribe.

    Ratchet has a very clear website that get's you on your way pretty fast.

    But I've learned that Ratchet uses WAMP v1 and Thruway can help me up and running with WAMP v2 so I can use the latest Autobahn version and the angular-wamp router.

    Could you please explain to me how I can get Thruway set up in the same way I've got Ratchet set up? I'd like to start everything from one command.

    PushServerCommand.php

    
        /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function fire()
        {
            $loop   = EventloopFactory::create();
            $pusher = new Pusher;
    
            // Listen for the web server to make a ZeroMQ push after an ajax request
            $context = new Context($loop);
            $pull = $context->getSocket(\ZMQ::SOCKET_PULL);
    
            $pull->bind('tcp://127.0.0.1:5555'); // Binding to 127.0.0.1 means the only client that can connect is itself
            $pull->on('message', [$pusher, 'onBlogEntry']);
    
            // Set up our WebSocket server for clients wanting real-time updates
            $webSock = new Server($loop);
            $webSock->listen(7474, '0.0.0.0'); // Binding to 0.0.0.0 means remotes can connect
            $webServer = new IoServer(
                new HttpServer(
                    new WsServer(
                        new WampServer(
                            $pusher
                        )
                    )
                ),
                $webSock
            );
    
            $loop->run();
    
        }
    
    

    Pusher.php

    
    class Pusher implements WampServerInterface {
        /**
         * A lookup of all the topics clients have subscribed to
         */
        protected $subscribedTopics = array();
    
        public function onSubscribe(ConnectionInterface $conn, $topic) {
            $this->subscribedTopics[$topic->getId()] = $topic;
        }
    
        /**
         * @param string JSON'ified string we'll receive from ZeroMQ
         */
        public function onBlogEntry($entry) {
            $entryData = json_decode($entry, true);
    
            // If the lookup topic object isn't set there is no one to publish to
            if (!array_key_exists($entryData['category'], $this->subscribedTopics)) {
                return;
            }
    
            $topic = $this->subscribedTopics[$entryData['category']];
    
            // re-send the data to all the clients subscribed to that category
            $topic->broadcast($entryData);
        }
    
        /* The rest of our methods were as they were, omitted from docs to save space */
    }
    
    

    Thank you a lot.

    opened by xtrasmal 13
  • How to extend SimpleWsRouter to handle functions from autobahn?

    How to extend SimpleWsRouter to handle functions from autobahn?

    I am using Laravel 8 and trying to integrate Thruway. Below is the code copied from SimpleWSRouter.php and added in my src.

            $port = 6001;
    
            $router = new Router();
    
            $transportProvider = new RatchetTransportProvider("127.0.0.1", $port);
    
            $router->addTransportProvider($transportProvider);
    
            $router->start();
    

    autobahn

            var connection = new autobahn.Connection({
                url: 'ws://localhost:6001',
                realm: 'realm1'
            });
    
            connection.onopen = function(session) {
    
                // 1) subscribe to a topic
                function onevent(args) {
                    console.log("Event:", args[0]);
                }
                session.subscribe('com.myapp.hello', onevent);
    
                // 2) publish an event
                session.publish('com.myapp.hello', ['Hello, world!']);
    
                // 3) register a procedure for remoting
                function procedureRegister(args) {
                    return args[0] + " " + args[1];
                }
                session.register('com.myapp.pr1', procedureRegister);
    
                // 4) call a remote procedure
                session.call('com.myapp.pr1', ["FNAME", "LNAME"]).then(
                    function(res) {
                        console.log("Result:", res);
                    }
                );
            };
    
            connection.open();
    

    I can connect without problem but I dont know what to do next after this.

    What I know:

    session.subscribe: subscribe to a channel (in this case channel name is "com.myapp.hello") session.publish: Probably used to send message from user to user using the channel name.

    What I dont know: session.register and session.call. I also dont know where should I add realm in my server to connect the code. I think realm1 is default realm.

    I actually came from ratchet. with ratchet, I can register a websocket server to work on open, close, message, etc. However Ratchet and Autobahn is not compatible ( with wampv1 and 2) etc.

    Any help would be appreciated.

    opened by kpebron 0
  • Subscription meta events

    Subscription meta events

    Following my question at https://github.com/voryx/Thruway/issues/361

    Added some meta events to the router, from the Subscription Meta API.

    Refs: https://wamp-proto.org/_static/gen/wamp_latest.html#subscription-meta-events https://crossbar.io/docs/Subscription-Meta-Events-and-Procedures/?highlight=meta#events

    Did not add the subscription_meta_api to the broker as this is only a partial implementation of the whole API. It does not include the api Procedures.

    Might implement the procedures in a near future.

    Usage

    $session->subscribe("wamp.metaevent.subscription.on_subscribe", $callbackFn);
    $session->subscribe("wamp.metaevent.subscription.on_unsubscribe", $callbackFn);
    $session->subscribe("wamp.metaevent.subscription.on_create", $callbackFn);
    $session->subscribe("wamp.metaevent.subscription.on_delete", $callbackFn);
    

    $callbackFn will receive $args as first argument where $args[0] = session meta information (the session that triggered the event) $args[1] = subscription meta information [ uri: string, match: string ]

    opened by Ethorsen 0
  • Question,  is there a way to monitor subscription channels in order to create a presence system

    Question, is there a way to monitor subscription channels in order to create a presence system

    Hi guys,

    I have trusted clients that will handle small chat rooms. It registers a few RPCs for the users to call and publish events on the chat subscription channel.

    I'd like to have this worker receive a notification whenever a user subscribe/unsubscribe from the room channel, so it can keep track of who's currently in. A simple presence system.

    Is there any way to do this? Any help to push me in the right direction would be appreciated.

    Thx

    opened by Ethorsen 2
  • Move AbstractTransport/TransportInterface from thruway/client to voryx/thruway-common

    Move AbstractTransport/TransportInterface from thruway/client to voryx/thruway-common

    I wasn't sure if this is the right place, as this is a cross repo organization issue, but seeing this repo is the final destination, it's probably the right place...

    If one tries to open a thruway router transport like thruway/ratchet-transport as a standalone project, and install it, they don't have all the dependencies required to get the full picture. Specifically, the abstract transport is not present. The project thruway/client needs to be added to that composer.json's require-dev to address this. However, that doesn't sound right to me for a router transport.

    So I think the class \Thruway\Transport\AbstractTransport and the interface \Thruway\Transport\TransportInterface should be moved to voryx/thruway-common and "voryx/thruway-common": "*" should be added as require-dev to all transports, including thruway/ratchet-transport.

    opened by boenrobot 0
  • Removed a requirement for role of authorization rules to be a valid URI.

    Removed a requirement for role of authorization rules to be a valid URI.

    There is nothing in the WAMP spec that says an auth role must be a valid URI.

    No other part of Thruway assumes the role to be a valid URI.

    I would add/fix the unit tests too to make sure this is checked, but honestly, I'm bit lost on the tests organization.

    opened by boenrobot 0
  • Allow replacing/extending of Broker and Dealer

    Allow replacing/extending of Broker and Dealer

    I'd like to implement some custom publish and call options in the router.

    Specifically, I'd like to make a module which forwards certain publish and call messages from one realm (a source) to another (a destination), and in the source realm, it can take the options for the destination realm into an option for the message.

    To accomplish this, I have two internal clients - one in the source realm, and one in the destination realm - and I forward to the destination on a message eligible for the source internal client. So far, so good... except the options of the publish/call in the source are not available in subscribe/register callbacks.

    Trying to add it to the details took me down to needing a custom subscription group for the publish messages, which in turn requires a custom broker. And similarly, implementing this for a call requires a custom dealer. This is however not possible currently.

    I've currently implemented this with a custom kwArg name instead that I know my application won't use, but I was hoping to generalize this enough that I can use fully arbitrary kwArgs.

    I guess I could instead implement two RPC calls in the source realm - one for publish to the destination and another for calls to the destination. While that would work too, and would allow any kwArgs, it would also be less ergonomic, as the original idea is that only the router would care that the known topics/procedures are special. The client in the source realm should publish and call as normal, not necessarily caring about the destination realm.

    EDIT: On second thought, for my use case, RPC calls would work fine. The only downside is that because both internal clients are trusted, this means anyone in the source realm can publish/call anything in the destination realm. Since there's no pattern matching of RPC calls yet (see #356 ), there's no way to add any authorization rules for the source realms... But in my case, the source realm is trusted enough, as it is an admin panel realm. If an unauthorized user has gained access to the realm, that alone is a bigger problem than ACL of RPC calls.

    Still though, brokers and dealers should ideally be extendable or replaceable.

    opened by boenrobot 0
Releases(0.6.1)
Owner
Voryx
Voryx
A web router implementation for PHP.

Aura.Router Powerful, flexible web routing for PSR-7 requests. Installation and Autoloading This package is installable and PSR-4 autoloadable via Com

Aura for PHP 469 Jan 1, 2023
Toro is a PHP router for developing RESTful web applications and APIs.

Toro Toro is a PHP router for developing RESTful web applications and APIs. It is designed for minimalists who want to get work done. Quick Links Offi

Kunal Anand 1.2k Dec 27, 2022
:tada: Release 2.0 is released! Very fast HTTP router for PHP 7.1+ (incl. PHP8 with attributes) based on PSR-7 and PSR-15 with support for annotations and OpenApi (Swagger)

HTTP router for PHP 7.1+ (incl. PHP 8 with attributes) based on PSR-7 and PSR-15 with support for annotations and OpenApi (Swagger) Installation compo

Sunrise // PHP 151 Jan 5, 2023
Simple, fast and yet powerful PHP router that is easy to get integrated and in any project.

Simple, fast and yet powerful PHP router that is easy to get integrated and in any project. Heavily inspired by the way Laravel handles routing, with both simplicity and expand-ability in mind.

Simon Sessingø 472 Jan 4, 2023
Pux is a fast PHP Router and includes out-of-box controller tools

Pux Pux is a faster PHP router, it also includes out-of-box controller helpers. 2.0.x Branch Build Status (This branch is under development) Benchmark

Yo-An Lin 1.3k Dec 21, 2022
A lightweight and simple object oriented PHP Router

bramus/router A lightweight and simple object oriented PHP Router. Built by Bram(us) Van Damme (https://www.bram.us) and Contributors Features Support

Bramus! 935 Jan 1, 2023
PhpRouter is a powerful, lightweight, and very fast HTTP URL router for PHP projects.

PhpRouter PhpRouter is a powerful, lightweight, and very fast HTTP URL router for PHP projects. Some of the provided features: Route parameters Predef

Milad Rahimi 152 Dec 28, 2022
A lightweight and fast router for PHP

Piko Router A lightweight and blazing fast router (see benchmarks) using a radix trie to store dynamic routes. This router maps routes to user defined

Piko framework 62 Dec 27, 2022
PHPRouter is an easy-to-use, fast, and flexible PHP router package with express-style routing.

PHP-Router is a modern, fast, and adaptable composer package that provides express-style routing in PHP without a framework.

Ayodeji O. 4 Oct 20, 2022
A lightweight and very basic PHP router.

Katya A lightweight PHP router Configuration Para servidor Apache, en el directorio del proyecto crea y edita un archivo .htaccess con lo siguiente: <

Luis RodrĂ­guez 0 Apr 4, 2022
klein.php is a fast & flexible router for PHP 5.3+

Klein.php klein.php is a fast & flexible router for PHP 5.3+ Flexible regular expression routing (inspired by Sinatra) A set of boilerplate methods fo

null 2.6k Jan 7, 2023
OpenAPI (Swagger) Specification Support for Sunrise Router (and not only)

OpenAPI (Swagger) Specification Support for Sunrise Router Important to understanding OpenAPI Specification Installation composer require 'sunrise/htt

Sunrise // PHP 3 Feb 12, 2022
Fast request router for PHP

FastRoute - Fast request router for PHP This library provides a fast implementation of a regular expression based router. Blog post explaining how the

Nikita Popov 4.7k Dec 23, 2022
:bird: Simple PHP router

Macaw Macaw is a simple, open source PHP router. It's super small (~150 LOC), fast, and has some great annotated source code. This class allows you to

Noah Buscher 895 Dec 21, 2022
Flight routing is a simple, fast PHP router that is easy to get integrated with other routers.

The PHP HTTP Flight Router divineniiquaye/flight-routing is a HTTP router for PHP 7.1+ based on PSR-7 and PSR-15 with support for annotations, created

Divine Niiquaye Ibok 16 Nov 1, 2022
A simple PHP Router

Panda Router Description the panda-router is a small alternative PHP router that can be used for small projects. With this router you can use differen

Jan Behrens 1 Dec 27, 2021
A PHP Router Package

Router A PHP Router Package Basic Concepts A router package is a utility that, once all http requests are redirected to an entry point, can configure

null 0 Aug 26, 2022
The simple PHP router

Macaw Macaw is a simple, open source PHP router. It's super small (~150 LOC), fast, and has some great annotated source code. This class allows you to

Noah Buscher 895 Dec 21, 2022
A fast & flexible router

Klein.php klein.php is a fast & flexible router for PHP 5.3+ Flexible regular expression routing (inspired by Sinatra) A set of boilerplate methods fo

null 2.6k Dec 28, 2022