PHP Client and Router Library for Autobahn and WAMP (Web Application Messaging Protocol) for Real-Time Application Messaging

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 Native PHP MVC With Auth. If you will build your own PHP project in MVC with router and Auth, you can clone this ready to use MVC pattern repo.

If you will build your own PHP project in MVC with router and Auth, you can clone this ready to use MVC pattern repo. Auth system is implemented. Works with bootstrap 5. Composer with autoload are implemented too for future composer require.

null 2 Jun 6, 2022
A PHP implementation of ActivityPub protocol based upon the ActivityStreams 2.0 data format.

ActivityPhp ActivityPhp is an implementation of ActivityPub layers in PHP. It provides two layers: A client to server protocol, or "Social API" This p

Landrok 175 Dec 24, 2022
This library extends the 'League OAuth2 Client' library to provide OpenID Connect Discovery support for supporting providers that expose a .well-known configuration endpoint.

OpenID Connect Discovery support for League - OAuth 2.0 Client This library extends the League OAuth2 Client library to provide OpenID Connect Discove

null 3 Jan 8, 2022
A simple library to work with JSON Web Token and JSON Web Signature

JWT A simple library to work with JSON Web Token and JSON Web Signature based on the RFC 7519. Installation Package is available on Packagist, you can

Luís Cobucci 6.8k Jan 3, 2023
Discord-oauth2 - At the end of oAuth2, which I have been researching and reading for a long time,

Discord-oauth2 - At the end of oAuth2, which I have been researching and reading for a long time, I finally found the way to connect with discord and get information, that's how I did it. If I'm wrong, feel free to email me so I can correct it.

Uğur Mercan 2 Jan 1, 2022
A One Time Password Authentication package, compatible with Google Authenticator.

Google2FA Google Two-Factor Authentication for PHP Google2FA is a PHP implementation of the Google Two-Factor Authentication Module, supporting the HM

Antonio Carlos Ribeiro 1.6k Dec 30, 2022
PHP 5.3+ oAuth 1/2 Client Library

PHPoAuthLib NOTE: I'm looking for someone who could help to maintain this package alongside me, just because I don't have a ton of time to devote to i

David Desberg 1.1k Dec 27, 2022
Laravel web rest api authentication library (PHP).

Webi auth library Laravel web rest api authentication library. Install (laravel 9, php 8.1) First set your .env variables (mysql, smtp) and then compo

Atomjoy 2 Nov 25, 2022
PHPoAuthLib provides oAuth support in PHP 7.2+ and is very easy to integrate with any project which requires an oAuth client.

PHPoAuthLib NOTE: I'm looking for someone who could help to maintain this package alongside me, just because I don't have a ton of time to devote to i

David Desberg 1.1k Dec 27, 2022
GoSign OneSign PHP API client

OneSign PHP API Client Reikalavimai PHP 7.4+ arba 8.0+ Patariam Nginx php-fpm Funkcijos PDF dokumentų pasirašymas; laiko žymų uždėjimas ant PDF dokume

Registrų centras 5 Nov 28, 2021
EvaOAuth provides a standard interface for OAuth1.0(a) / OAuth2.0 client authorization, it is easy to integrate with any PHP project by very few lines code.

EvaOAuth EvaOAuth provides a standard interface for OAuth1.0 / OAuth2.0 client authorization, it is easy to integrate with any PHP project by very few

AlloVince 256 Nov 16, 2022
EvaOAuth provides a standard interface for OAuth1.0(a) / OAuth2.0 client authorization, it is easy to integrate with any PHP project by very few lines code.

EvaOAuth EvaOAuth provides a standard interface for OAuth1.0 / OAuth2.0 client authorization, it is easy to integrate with any PHP project by very few

AlloVince 261 Jan 17, 2022
PHP OpenID Connect Basic Client

PHP OpenID Connect Basic Client A simple library that allows an application to authenticate a user through the basic OpenID Connect flow. This library

Michael Jett 469 Dec 23, 2022
OAuth client integration for Symfony. Supports both OAuth1.0a and OAuth2.

HWIOAuthBundle The HWIOAuthBundle adds support for authenticating users via OAuth1.0a or OAuth2 in Symfony. Note: this bundle adds easy way to impleme

Hardware Info 2.2k Dec 30, 2022
OAuth 1 Client

OAuth 1.0 Client OAuth 1 Client is an OAuth RFC 5849 standards-compliant library for authenticating against OAuth 1 servers. It has built in support f

The League of Extraordinary Packages 907 Dec 16, 2022
Buddy Provider for the OAuth 2.0 Client

Buddy Provider for OAuth 2.0 Client This package provides Buddy OAuth 2.0 support for the PHP League's OAuth 2.0 Client. Installation To install, use

Buddy 0 Jan 19, 2021
Open source social sign on PHP Library. HybridAuth goal is to act as an abstract api between your application and various social apis and identities providers such as Facebook, Twitter and Google.

Hybridauth 3.7.1 Hybridauth enables developers to easily build social applications and tools to engage websites visitors and customers on a social lev

hybridauth 3.3k Dec 23, 2022
Auth is a module for the Yii PHP framework that provides a web user interface for Yii's built-in authorization manager

Auth is a module for the Yii PHP framework that provides a web user interface for Yii's built-in authorization manager (CAuthManager). You can read more about Yii's authorization manager in the framework documentation under Authentication and Authorization.

Christoffer Niska 134 Oct 22, 2022
php database agnostic authentication library for php developers

Whoo Whoo is a database agnostic authentication library to manage authentication operation easily. Whoo provides you a layer to access and manage user

Yunus Emre Bulut 9 Jan 15, 2022