vankosoft/thruway-bundle
Composer 安装命令:
composer require vankosoft/thruway-bundle
包简介
VankoSoft Symfony Application Extension - WebSockets (WAMP2) integration
README 文档
README
#VankoSoft Symfony Application Extension - WebSockets (WAMP2) integration
This a Symfony Bundle for Thruway, which is a php implementation of WAMP (Web Application Messaging Protocol).
Note: This project is still undergoing a lot of changes, so the API will change.
Quick Start with Composer
Install the Thruway Bundle
$ composer require "vankosoft/thruway-bundle"
Update AppKernel.php (when using Symfony < 4)
$bundles = array( // ... Vankosoft\ThruwayBundle\VSThruwayBundle::class => ['all' => true], // ... );
Configuration
#app/config/config.yml vs_thruway: realm: 'realm1' url: 'ws://127.0.0.1:8081' #The url that the clients will use to connect to the router router: ip: '127.0.0.1' # the ip that the router should start on port: '8080' # public facing port. If authentication is enabled, this port will be protected trusted_port: '8081' # Bypasses all authentication. Use this for trusted clients. # authentication: false # true will load the AuthenticationManager locations: bundles: ["AppBundle"] # files: # - "Acme\\DemoBundle\\Controller\\DemoController" # # For symfony 4, this bundle will automatically scan for annotated worker files in the src/Controller folder
You can also tag services with thruway.resource and any annotation will get picked up
<service id="some.service" class="Acme\Bundle\SomeService"> <tag name="thruway.resource"/> </service>
Note: tagging a service as thruway.resource will make it public.
services: App\Worker\: resource: '../src/Worker' tags: ['thruway.resource']
The WAMP-CRA service is already configured, we just need to add a tag to it to have the bundle install it:
wamp_cra_auth: class: Thruway\Authentication\WampCraAuthProvider parent: voryx.thruway.wamp.cra.auth.client tags: - { name: thruway.internal_client }
Custom Authorization Manager
You can set your own Authorization Manager in order to check if a user (identified by its authid) is allowed to publish | subscribe | call | register
Create your Authorization Manager service, extending RouterModuleClient and implementing RealmModuleInterface (see the Thruway doc for details)
// src/ACME/AppBundle/Security/MyAuthorizationManager.php use Thruway\Event\MessageEvent; use Thruway\Event\NewRealmEvent; use Thruway\Module\RealmModuleInterface; use Thruway\Module\RouterModuleClient; class MyAuthorizationManager extends RouterModuleClient implements RealmModuleInterface { /** * Listen for Router events. * Required to add the authorization module to the realm * * @return array */ public static function getSubscribedEvents() { return [ 'new_realm' => ['handleNewRealm', 10] ]; } /** * @param NewRealmEvent $newRealmEvent */ public function handleNewRealm(NewRealmEvent $newRealmEvent) { $realm = $newRealmEvent->realm; if ($realm->getRealmName() === $this->getRealm()) { $realm->addModule($this); } } /** * @return array */ public function getSubscribedRealmEvents() { return [ 'PublishMessageEvent' => ['authorize', 100], 'SubscribeMessageEvent' => ['authorize', 100], 'RegisterMessageEvent' => ['authorize', 100], 'CallMessageEvent' => ['authorize', 100], ]; } /** * @param MessageEvent $msg * @return bool */ public function authorize(MessageEvent $msg) { if ($msg->session->getAuthenticationDetails()->getAuthId() === 'username') { return true; } return false; } }
Register your authorization manager service
my_authorization_manager: class: ACME\AppBundle\Security\MyAuthorizationManager
Insert your service name in the voryx_thruway config
#app/config/config.yml voryx_thruway: ... authorization: my_authorization_manager # insert the name of your custom authorizationManager ...
Restart the Thruway server; it will now check authorization upon publish | subscribe | call | register. Remember to catch error when you try to subscribe to a topic (or any other action) as it may now be denied and this will be returned as an error.
Usage
Register RPC
use Voryx\ThruwayBundle\Annotation\Register; /** * * @Register("com.example.add") * */ public function addAction($num1, $num2) { return $num1 + $num2; }
Call RPC
public function call($value) { $client = $this->container->get('thruway.client'); $client->call("com.myapp.add", [2, 3])->then( function ($res) { echo $res[0]; } ); }
Subscribe
use Voryx\ThruwayBundle\Annotation\Subscribe; /** * * @Subscribe("com.example.subscribe") * */ public function subscribe($value) { echo $value; }
Publish
public function publish($value) { $client = $this->container->get('thruway.client'); $client->publish("com.myapp.hello_pubsub", [$value]); }
It uses Symfony Serializer, so it can serialize and deserialize Entities
use Voryx\ThruwayBundle\Annotation\Register;
/**
*
* @Register("com.example.addrpc", serializerEnableMaxDepthChecks=true)
*
*/
public function addAction(Post $post)
{
//Do something to $post
return $post;
}
Start the Thruway Process
You can start the default Thruway workers (router and client workers), without any additional configuration.
$ nohup php app/console thruway:process start &
By default, the router starts on ws://127.0.0.1:8080
Workers
The Thruway bundle will start up a separate process for the router and each defined worker. If you haven't defined any workers, all of the annotated calls and subscriptions will be started within the default worker.
There are two main ways to break your application apart into multiple workers.
-
Use the
workerproperty on theRegisterandSubscribeannotations. The following RPC will be added to thepostsworker.use Voryx\ThruwayBundle\Annotation\Register; /** * @Register("com.example.addrpc", serializerEnableMaxDepthChecks=true, worker="posts") */ public function addAction(Post $post)
-
Use the
@Workerannotation on the class. The following annotation will create a worker calledchatthat can have a max of 5 instances.use Voryx\ThruwayBundle\Annotation\Worker; /** * @Worker("chat", maxProcesses="5") */ class ChatController
If a worker is shut down with anything other than SIGTERM, it will automatically be restarted.
More Commands
To see a list of running processes (workers)
$ php app/console thruway:process status
Stop a process, i.e. default
$ php app/console thruway:process stop default
Start a process, i.e. default
$ php app/console thruway:process start default
Javascript Client
For the client, you can use AutobahnJS or any other WAMPv2 compatible client.
Here are some examples
Symfony 4 Quick Start
composer create-project symfony/skeleton my_project
cd my_project
composer require symfony/expression-language
composer require symfony/annotations-pack
composer require voryx/thruway-bundle:dev-master
Create config/packages/my_project.yml with the following config:
voryx_thruway: realm: 'realm1' url: 'ws://127.0.0.1:8081' #The url that the clients will use to connect to the router router: ip: '127.0.0.1' # the ip that the router should start on port: '8080' # public facing port. If authentication is enabled, this port will be protected trusted_port: '8081' # Bypasses all authentication. Use this for trusted clients.
Create the controller src/Controller/TestController.php
<?php namespace App\Controller; use Voryx\ThruwayBundle\Annotation\Register; class TestController { /** * @Register("com.example.add") */ public function addAction($num1, $num2) { return $num1 + $num2; } }
Test to see if the RPC has been configured correctly bin/console thruway:debug
URI Type Worker File Method com.example.add RPC default /my_project/src/Controller/TestController.php addAction
For more debug info for the RPC we created: bin/console thruway:debug com.example.add
Start everything: bin/console thruway:process start
The RPC com.example.add is now available to any WAMP client connected to ws://127.0.0.1:8081 on realm1.
vankosoft/thruway-bundle 适用场景与选型建议
vankosoft/thruway-bundle 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 17 次下载、GitHub Stars 达 0, 最近一次更新时间为 2024 年 10 月 10 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「symfony」 「sockets」 「WebSockets」 「WAMP」 「WAMP2」 「Autobahn」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 vankosoft/thruway-bundle 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 vankosoft/thruway-bundle 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 vankosoft/thruway-bundle 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
The bundle for easy using json-rpc api on your project
Synchronous Message Passing Framework for PHP
Thruway WAMP router core
A Laravel Nova tool to integrate websockets into Nova.
Bundle Symfony DaplosBundle
Binding for raw sockets (ext-sockets) in reactphp
统计信息
- 总下载量: 17
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 22
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2024-10-10