[workerman]通过websocket长连接实现聊天工具

wokerman的一些实例可以通过官方的网站:

http://doc3.workerman.net/getting-started/simple-example.html

实例一、使用HTTP协议对外提供Web服务

创建http_test.php文件(位置任意,能引用到Workerman/Autoloader.php即可,下同)

<?php
use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';

// 创建一个Worker监听2345端口,使用http协议通讯
$http_worker = new Worker("http://0.0.0.0:2345");

// 启动4个进程对外提供服务
$http_worker->count = 4;

// 接收到浏览器发送的数据时回复hello world给浏览器
$http_worker->onMessage = function($connection, $data)
{
    // 向浏览器发送hello world
    $connection->send('hello world');
};

// 运行worker
Worker::runAll();

命令行运行(windows用户用 cmd命令行,下同)

php http_test.php start

测试

假设服务端ip为127.0.0.1

在浏览器中访问url http://127.0.0.1:2345

注意:如果出现无法访问的情况,请检查服务器防火墙。

实例二、使用WebSocket协议对外提供服务

创建ws_test.php文件

<?php
use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';

// 创建一个Worker监听2346端口,使用websocket协议通讯
$ws_worker = new Worker("websocket://0.0.0.0:2346");

// 启动4个进程对外提供服务
$ws_worker->count = 4;

// 当收到客户端发来的数据后返回hello $data给客户端
$ws_worker->onMessage = function($connection, $data)
{
    // 向客户端发送hello $data
    $connection->send('hello ' . $data);
};

// 运行worker
Worker::runAll();

命令行运行

php ws_test.php start

测试

打开chrome浏览器,按F12打开调试控制台,在Console一栏输入(或者把下面代码放入到html页面用js运行)

// 假设服务端ip为127.0.0.1
ws = new WebSocket("ws://127.0.0.1:2346");
ws.onopen = function() {
    alert("连接成功");
    ws.send('tom');
    alert("给服务端发送一个字符串:tom");
};
ws.onmessage = function(e) {
    alert("收到服务端的消息:" + e.data);
};

注意:如果出现无法访问的情况,请检查服务器防火墙。

实例三、直接使用TCP传输数据

创建tcp_test.php

<?php
use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';

// 创建一个Worker监听2347端口,不使用任何应用层协议
$tcp_worker = new Worker("tcp://0.0.0.0:2347");

// 启动4个进程对外提供服务
$tcp_worker->count = 4;

// 当客户端发来数据时
$tcp_worker->onMessage = function($connection, $data)
{
    // 向客户端发送hello $data
    $connection->send('hello ' . $data);
};

// 运行worker
Worker::runAll();

命令行运行

php tcp_test.php start

测试:命令行运行

telnet 127.0.0.1 2347
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
tom
hello tom

注意:如果出现无法访问的情况,请检查服务器防火墙。

workerman-chat可以直接实现聊天工具:实现的页面

http://www.workerman.net/workerman-chat

http://www.dadaaierer.com/tool/chat

 

[转]Web实时弹幕原理分析

Web实时弹幕原理分析

废话不多说,首先上效果图。

效果图


Web实时弹幕原理分析

用途

  • 搞活动、年会的时候,在大屏幕上实时显示留言、吐槽。
  • 在视频网站上,将大家的吐槽实时展示出来。

原理

其他原理挺简单的,就是将大家的留言实时展示出来。

注意点:实时性、动画效果、数据存储。

实时性

首先我们会想到,Ajax轮循 简单,粗暴。

客户端和服务器之间会一直进行连接,每隔一段时间就询问一次。

客户端会轮询,判断有没有新消息。

这种方式连接数会很多,一个接受,一个发送。

而且每次发送请求都会有Http的Header,会很耗流量,也会消耗CPU的利用率。

所以,这个方案是不可取的。

可以通过长连接,socket.io 来实现。

Socket.IO 官方地址:http://socket.io/

Socket.IO 支持 WebSocket 协议、用于实时通信和跨平台的框架。

Socket.IO 设计的目标是构建能够在不同浏览器和移动设备上良好运行的实时应用。

如实时分析系统、二进制流数据处理应用、在线聊天室、在线客服系统、评论系统、WebIM等。

目前,Socket.IO 已经支持主流PC浏览器(IE、Safari、Chrome、Firefox、Opera等)。

移动平台上的浏览器(iOS平台下的Safari、Android平台下的基于Webkit的浏览器等)。

Socket.IO 实现了实时、双向、基于事件的通讯机制,它解决了实时的通信问题,并统一了服务端与客户端的编程方式。

启动了Socket以后,就像建立了一条客户端与服务端的管道,两边可以信息互通。

利用Socket.IO 与 Workerman 结合 ,双剑合璧。

Workerman 官方地址:http://www.workerman.net/

动画效果

CommentCoreLibrary
http://jabbany.github.io/CommentCoreLibrary/demo/

GoEasy
http://goeasy.io/www/demo/barrage

jquery.barrager.js

Jquery.barrager.js 是一款优雅的网页弹幕插件,支持显示图片,文字以及超链接。

支持速度、高度、颜色、数量等自定义

链接:http://yaseng.org/jquery.barrager.js/

大家可以浏览上面提供的Demo,根据自己的实际需求进行修改,优化。

数据存储

切记不要每次发送数据的时候实时插入的数据库中,可以利用异步处理。

首先将数据存储到缓存中,异步将缓存的数据同步到数据库中。

效果图的实现方法:

Socket.IO + Workerman + jquery.barrager.js

大家可以关注微信公众号,回复 “弹幕源码”,即可获取源码

[php5.6]php扩展开发入门–helloworld

 

首先需要下载php源码

1,生成扩展骨架 php-5.6.30/ext$ ./ext_skel –extname=helloWorld
同时产生操作步骤
1. $ cd ..
2. $ vi ext/helloWorld/config.m4
3. $ ./buildconf
4. $ ./configure –[with|enable]-helloWorld
5. $ make
6. $ ./sapi/cli/php -f ext/helloWorld/helloWorld.php
7. $ vi ext/helloWorld/helloWorld.c
8. $ make

2,vim config.m4
把第10-13行
PHP_ARG_WITH(helloWorld, for helloWorld support,
Make sure that the comment is aligned:
[ –with-helloWorld Include helloWorld support])
注释dnl去掉

132b2005134ec7d02ac7b8137212d5c3

3,./buildconf –force
4,./configure –with-helloWorld
5 make 可选
6,进入到扩展vim helloWorld.c
修改144-147行
照着添加一个方法定义
PHP_FE(helloWorld, NULL)

同时添加一个实现
PHP_FUNCTION(helloWorld)
{
char *arg = NULL;
int arg_len;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, “s”, &arg, &arg_len) == FAILURE) {
return;
}
RETURN_STRINGL(arg, arg_len, 0);

}

7 正常的添加扩展步骤
1)phpize
2)./configure –with-php-config=/home/users/wangchunwei/php/bin/php-config
3) make
4) make install

 

剩下的步骤就是配置php.ini的扩展,添加helloWorld.so。之后调用helloWorld(“string”)方法,亲测可用!