sidney/latchet

该软件包最新版本(v1.0.0-alpha)没有可用的许可证信息。

使用 Laravel 4 的 WebSockets

v1.0.0-alpha 2013-04-29 14:36 UTC

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

配置选项不多,最重要的是enablePushzmqPort。这需要在您的服务器上做一些额外的配置,将在下一节中讨论。

其余选项应该很容易理解。

启用推送

待办事项,在此之前 -> 脑图

使用

简介

如前所述,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