bfg / puller
puller的描述。
Requires
- php: >=7.4
- laravel/framework: ^8.0|^9.0|^10.0
README
安装
composer require bfg/puller
简而言之
此包旨在处理需要最低实时性的情况,但将WebSocket提升到过于昂贵或无意义。包的核心是最简单的长连接,易于安装和配置。它增加了对用户标签的控制,允许我们控制所有用户标签的状态并向所有浏览器中的所有用户标签发送命令。因此,我们有机会跟踪在线仪表和用户实时列表。
Redis
请注意,默认情况下,该包使用默认的缓存系统,包括那里列出的驱动程序,但如果将缓存驱动程序切换到redis,您将感受到速度的显著提升,并获得更好的任务分配系统和在线状态。
... CACHE_DRIVER=redis ...
为此,您需要为
php安装Redis扩展。
用法
为了开始使用,您需要做一些简单的事情
- 确保在您的
public/vendor文件夹中发布了puller/puller.js。它必须在安装包后立即出现,因为它在laravel-assets组中进行了发布。如果没有发生这种情况,并且它没有出现在那里,请手动发布它
php artisan vendor:publish --tag=puller-assets
- 将脚本连接到您的文档
<script src="{{ asset('vendor/puller/puller.js') }}"></script>
- 准备您自己的文档事件监听器
document.addEventListener('my_test', function ({detail}) { console.log(detail); });
- 提交Puller命令
\Puller::user(Auth::user()) ->channel('my_test') ->stream('Hello world!');
进一步,在浏览器中,在开发者控制台中,您将看到反应。
高级Puller
如果您希望主要处理和从任务接收方接收数据,则必须使用该高级
Pullers,因为handle方法始终在接收方执行。
生成工作进程
php artisan make:task MyTestPull
之后,您将有一个名为worker的类:app/Pulls/MyTestPull.php
<?php namespace App\Pulls; use Bfg\Puller\Task; class MyTestPull extends Task { public function handle () { // } }
在Handle方法中描述的内容将在客户端执行任务时在客户端执行。此方法返回的内容将被作为事件的详细信息发送。事件名称将自动生成,或者您可以指定protected ?string $name = "my_name";属性。
public function handle () { return "Hello world!"; }
准备您自己的文档事件监听器
document.addEventListener('my_test_pull', function ({detail}) { // console.log(detail); });
基于类的事件名称将以
snake_case形式生成,MyTestPull将转换为my_test_pull。
提交Puller工作进程
\App\Pulls\MyTest::user(\Auth::user()) ->stream();
进一步,在浏览器中,在开发者控制台中,您将看到反应。
另一个带设计师的示例
app/Pulls/SayHelloPull.php
<?php namespace App\Pulls; use Bfg\Puller\Task; class MyTestPull extends Task { protected $user_name; public function __construct(string $user_name) { $this->user_name = $user_name; } public function handle () { return "Hello, " . $this->user_name; } }
"stream" 向所选用户的每个标签发送
当前授权用户默认安装,它只是用用户传递的示例表示,您可以在那里传递模型和标识符。
\App\Pulls\MyTest::user(\Auth::user()) // Current auth user set by default ->stream('Administrator');
"flux" 向所有在线用户发送
\App\Pulls\MyTest::flux('Administrator');
"flow" 向当前标签(如果存在)发送
\App\Pulls\MyTest::flow('Administrator'); \App\Pulls\MyTest::new()->channel('my_test')->flow('Administrator');
"totab" 向所选标签发送
\App\Pulls\MyTest::totab($tabid, 'Administrator'); \App\Pulls\MyTest::new()->channel('my_test')->totab($tabid, 'Administrator');
创建带点的类
php artisan make:task DarkMode_Toggle
将生成
dark_mode.toggle名称
Puller事件
UserOnlineEvent
当用户上线时触发的事件。
Event::listen(\Bfg\Puller\Events\UserOnlineEvent::class, function (UserOnlineEvent $event) { info("User $event->user_id online"); });
UserOfflineEvent
当用户失踪时触发的事件。
Event::listen(\Bfg\Puller\Events\UserOfflineEvent::class, function (UserOfflineEvent $event) { info("User $event->user_id offline"); });
TestListenNewTab
当用户打开新标签时触发的事件。
Event::listen(\Bfg\Puller\Events\UserNewTabEvent::class, function (UserNewTabEvent $event) { info("User $event->user_id new tab $event->tab"); });
注意!如果您重新启动一个标签页,离线和在线事件将不会工作,因为实际上如果您需要为每次页面加载事件,那么每次您重新启动页面时,都认为您创建了一个新的标签页。
TestListenNewTab
用户关闭标签页时触发的事件。
Event::listen(\Bfg\Puller\Events\UserCloseTabEvent::class, function (UserCloseTabEvent $event) { info("User $event->user_id close tab $event->tab"); });
拉取器界面
获取当前进程标签页(从标题 'Puller-KeepAlive' 读取)
\Puller::myTab();
创建新的匿名任务
\Puller::new();
带有通道的新匿名任务
\Puller::channel();
在线用户数量
\Puller::online();
在线用户列表
\Puller::users();
是否在线用户
\Puller::isOnlineUser(int $user_id);
在线用户标识符列表
\Puller::identifications();
简短的事件监听器设置
\Puller::onOnline(function (UserOnlineEvent $event) { info("User $event->user_id online"); }); \Puller::onOffline(callable); \Puller::onOnlineAndOffline(callable); \Puller::onNewTab(callable); \Puller::onCloseTab(callable); \Puller::onNewAndCloseTab(callable);
模型监视
您可以使用模型事件监听器的辅助器。
\App\Pulls\MyTest::modelWatchToStream( \App\Modeld\Message::class, $events = [] // 'updated', 'created', 'deleted' by default ); \App\Pulls\MyTest::modelWatchToFlow( \App\Modeld\Message::class, $events = [] // 'updated', 'created', 'deleted' by default ); \App\Pulls\MyTest::modelWatchToFlux( \App\Modeld\Message::class, $events = [] // 'updated', 'created', 'deleted' by default ); \App\Pulls\MyTest::modelOwnerWatchToStream( \App\Modeld\Message::class, $owner_field = "user_id", $events = [] // 'updated', 'created', 'deleted' by default ); \App\Pulls\MyTest::modelOwnerWatchToFlow( \App\Modeld\Message::class, $owner_field = "user_id", $events = [] // 'updated', 'created', 'deleted' by default ); \App\Pulls\MyTest::modelOwnerWatchToFlux( \App\Modeld\Message::class, $owner_field = "user_id", $events = [] // 'updated', 'created', 'deleted' by default ); // Or \App\Pulls\MyTest::modelWatchToFlow([ \App\Modeld\Message::class, \App\Modeld\User::class, ]);
报告将被发送到您在属性
$owner_field中指定的列的用户标识符(可能是一个包含多个列的数组)。
移动区域
责任区域移动的区域,如果区域将在区域内释放,则区域会固定它并将调用发布到大规模控制队列,并且一般调用可能已经委托了运输类型。因此,我们对任务有大规模控制。
\Puller::moveZone('admin', function () { \Puller::channel('test')->detail('hi'); \Puller::channel('test2')->detail('hi2'); \Puller::channel('test3')->detail('hi3'); })->flux();
JavaScript
您有一个全局注册的 Puller 对象,用于外部控制。
Puller.tab(); // Get current tab id. Puller.run(); // Run subscription. Puller.stop(); // Stop subscription. Puller.restart(); // Reconnect subscription will make stop and launch. Puller.channel(name, callback); // Add Channel handler (Alpine and Livewire are channels). Puller.state(name, value); // Set or unset the state for uninterrupted communication. Puller.emit(channel, name, detail); // Reply imitation to `Puller`. Puller.dispatch(eventName, detail); // Dispatch a browser event. Puller.message(eventName, data); // Send a message with the name of events and data for Backend.
消息传递
Messages - 这是一个在流中执行任务并分配任务到当前执行请求和连接的机制。
为了使用消息传递机制,您应该了解最小数据类型规范。
后端上的消息是什么?
消息是对事件的签名请求。为了同时传输事件名称而不传输其完整名称范围,系统将查找依赖于您的安全守护者编译的任何空间中的嵌套,默认为 web,因此您的嵌套前缀将是下一个 WebMessage,并且所有创建和声明的事件都将一致触发,如果有一个以上的事件具有相同的名称。
事件搜索按照以下模式发生
发送名称:
my-event或my;调用事件:
*\WebMessage\MyEvent
发送名称:
actions:my-event或actions:my;调用事件:
*\WebMessageActions\MyEvent
*- 可能是任何值。
所有从该事件发送的 Puller 事件都将插入到请求响应中,并将任务分配给现在可以处理的服务站和需要发送给其他人的任务。
消息中的所有传输值都将添加到请求表单中。
查看可以处理消息的所有事件
php artisan puller:events
插件
Livewire 支持
https://github.com/bfg-s/puller-livewire
Alpine 支持
https://github.com/bfg-s/puller-alpine
变更日志
请参阅 CHANGELOG 以获取有关最近更改的更多信息。
安全
如果您发现任何安全相关的问题,请通过电子邮件 xsaven@gmail.com 而不是使用问题跟踪器。
许可
MIT 许可证(MIT)。有关更多信息,请参阅 许可文件。