sidney / latchet
使用 Laravel 4 的 WebSockets
Requires
- php: >=5.3.0
- cboden/ratchet: dev-master
- illuminate/support: 4.0.x
This package is not auto-updated.
Last update: 2024-09-24 06:46:51 UTC
README
##重要
这甚至不是一个 alpha 版本。还有很多事情在进行中。文档尚未完成,一些代码需要润色。因此,请勿在生产环境中使用此软件包——目前还不行。如果您想保持最新,可以关注我的Twitter
##简介
Latchet简化了PHP支持的实时应用程序的开发。本质上,它是Ratchet的扩展版本,可以很好地与Laravel协同工作。
如果您已经完成了基本WampServer的设置,您将拥有类似以下内容
Latchet::topic('chat/room/{roomid}', 'ChatRoomController');
安装
Earlybird
在我提交包到Packagist之前,直接从GitHub包含它。
"repositories": [
{
"type": "vcs",
"url": "https://github.com/sidneywidmer/latchet"
}
],
"require": {
"sidney/latchet": "dev-master"
}
所需设置
在composer.json
文件的require
键中添加以下内容
"sidney/latchet": "dev-master"
运行Composer更新命令
$ composer update
在您的config/app.php
中,将'Sidney\Latchet\LatchetServiceProvider'
添加到$providers
数组的末尾
'providers' => array(
'Illuminate\Foundation\Providers\ArtisanServiceProvider',
'Illuminate\Auth\AuthServiceProvider',
...
'Sidney\Latchet\LatchetServiceProvider',
),
在config/app.php
的末尾,将'Latchet' => 'Sidney\Latchet\LatchetFacade'
添加到$aliases
数组中
'aliases' => array(
'App' => 'Illuminate\Support\Facades\App',
'Artisan' => 'Illuminate\Support\Facades\Artisan',
...
'Latchet' => 'Sidney\Latchet\LatchetFacade',
),
配置
使用以下Artisan命令发布配置文件:php artisan config:publish sidney/latchet
配置选项不多,最重要的是enablePush
和zmqPort
。这需要在您的服务器上做一些额外的配置,将在下一节中讨论。
其余选项应该很容易理解。
启用推送
待办事项,在此之前 -> 脑图
- 安装zermq;(按此顺序)ubuntu
- http://johanharjono.com/archives/633(如果不起作用,从源代码编译)
- http://www.zeromq.org/intro:get-the-software
- http://www.zeromq.org/bindings:php(可能需要apt-get install pkg-config, make)
- 将extension=zmq.so添加到php.ini
- 检查是否已加载扩展php -m
- 检查是否已安装zeromq软件包(zlib1g)dpkg --get-selections
使用
简介
如前所述,Latchet基于Ratchet,通过一些额外的功能扩展了其功能,例如在主题中传递参数。但为了简化,Latchet也移除了Ratchet提供的一些灵活性。Latchet仅专注于为您的应用程序提供WampServer。
主题
我强烈建议您阅读Ratchet文档。它们清楚地解释了基本原理。
一旦您掌握了它的用法,主题就很容易理解。想象一下您熟悉的Laravel路由。
Route::get('my/route/{parameter}', 'MyController@action');
主题(或如果您熟悉其他形式的消息传递,频道)对于WebSocket连接是相同的。总有一个客户端订阅主题。如果其他客户端连接到相同的主题,他们可以向订阅该主题的客户端或特定客户端广播消息。下一章将介绍如何注册处理传入连接的控制器。
服务器
本节中我们做的一切都是为了设置一个WampServer,然后从命令行启动它并监听传入的连接。基本上,我们需要设置两个不同的处理器。一个用于处理不同的连接操作,以及至少一个用于处理我们的主题操作。
为了澄清一些内容
连接操作包括
- 打开
- 关闭
- 错误
主题操作包括
- 订阅
- 发布
- 调用
- 退订
生成文件 - artisan方式
为了简化流程,有一个易于使用的artisan命令可以生成所有必要的文件
$ php artisan latchet:generate
这将做两件事。首先,它会创建app/socket文件夹并复制这个文件夹中的两个文件。一个用于处理传入连接(Connection.php)和一个用于处理订阅等主题操作(TestTopic.php)。其次,它会在app/routes.php文件的末尾注册这两个新类。
确保将socket文件夹添加到laravel类加载器或composer.json文件中。最简单的方法是在app/start/global.php文件中添加app_path().'/socket',
。
ClassLoader::addDirectories(array(
app_path().'/controllers',
...
app_path().'/socket',
));
基本上,你现在可以启动服务器并订阅test-topic
。我建议查看下一章,它们解释了如何使用新添加的连接和主题处理器。
连接处理器
如果你运行了上述artisan:generate
命令,你将在routes.php文件中注册一个连接处理器。它定义了如何对不同连接操作做出反应。所以每次有新的连接到服务器时,我们会询问控制器要做什么。简单得很。
Latchet::connection('Connection');
它处理以下操作
- 打开
- 关闭
- 错误
所有三个操作都传递一个Connection
对象作为$connection
。更多关于这个对象的信息可以在官方Ratchet API文档中找到:Ratchet API - Class WampConnection
例如,你可以在这里关闭一个连接$connection->close()
,或者向连接对象添加一些额外的信息。
$connection->Chat = new \StdClass;
$connection->Chat->rooms = array();
$connection->Chat->name = $connection->WAMP->sessionId;
从现在起,$connection->Chat->name
将始终在$connection
变量中可用,这个变量传递给大多数操作方法。
因为服务器应该持续运行,所以有一个额外的错误处理函数。每当发生错误时,都会触发错误函数。在默认模板中,该模板由artisan命令生成,错误会被再次抛出。这会停止服务器并在控制台显示错误。对于生产环境,重要的是不要重新抛出错误,而是记录它。例如,如果有人尝试连接到一个不存在的主题,将会抛出错误。
主题处理器
现在有趣了。使用latchet可以注册新主题并传递参数给它
Latchet::topic('chat/room/{roomid}', 'ChatRoomController');
在主题处理器中(例如app/socket/ChatRoomController.php
)
<?php
use \Sidney\Latchet\BaseTopic;
class ChatRoomController extends BaseTopic {
public function subscribe($connection, $topic, $roomid = null)
{
//useful for debuging as this will echo the text in the console
echo $roomid;
}
…
如果客户端现在订阅了chat/room/lobby
,你的类中将获得'lobby'的值。
如果你想要向特定频道的所有其他订阅者广播消息(消息会被json编码)
public function publish($connection, $topic, $message, array $exclude, array $eligible)
{
$this->broadcast($topic, array('msg' => 'New broadcasted message!'))
}
还有其他方法来处理以下操作
- 订阅
- 发布
- 调用
- 退订
推送
如果你在配置文件中启用了推送,你还可以从应用程序的不同位置发布消息。
Latchet::publish('chat/room/lobby', array('msg' => 'foo'));
例如,你可以对ajax请求做出反应。
启动服务器
使用以下artisan命令启动服务器
$ sudo php artisan latchet:listen
同时,确保阅读Ratchet文档了解如何部署你的应用程序:Ratchet Docs - Deployment
关于环境的一句话:因为整个应用程序都将从控制台运行,确保在控制台命令中传递所需的参数,例如
$ sudo php artisan latchet:listen --env=local
客户端
现在我们的服务器已经启动并运行,我们需要连接到它,对吧?Autobahn JS来帮忙。
JavaScript / 兼容旧版浏览器
Autobahn JS负责处理客户端操作。请确保查看他们的文档,同时,这里有一个基本示例:
conn = new ab.Session(
'ws://latchet.laravel-devbox.dev:1111', // The host (our Latchet WebSocket server) to connect to
function() { // Once the connection has been established
conn.subscribe('chat/room/lobby', function(topic, event) {
console.log('event: ');
console.log(event);
});
},
function() {
// When the connection is closed
console.log('WebSocket connection closed');
},
{
// Additional parameters, we're ignoring the WAMP sub-protocol for older browsers
'skipSubprotocolCheck': true
}
);
对于不支持WebSocket的老旧浏览器,请确保包含web-socket-js并在您的配置文件中允许Flash。
演示应用
检查使用Laravel、latchet包、autobahn.js和backbone构建的演示应用程序:whatup。对于实时演示,请访问:whatup.im