八Wokerman
25. windos下测试
下载windos版的Wokerman
实例一、使用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
我的是
cd D:phpStudyphpphp-7.0.12-nts
D:
php.exe D:wwwwkmanhttp_test.php
测试
假设服务端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
我的是
cd D:phpStudyphpphp-7.0.12-nts
D:
php.exe D:wwwwkman
ws_test.php
测试
打开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
我的是
cd D:phpStudyphpphp-7.0.12-nts
D:
php.exe D:wwwwkman
tcp_test.php
测试:命令行运行
(以下是linux命令行效果,与windows下效果有所不同)
telnet 127.0.0.1 2347 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. tom hello tom
我的
telnet 127.0.0.1 2347
然而telnet
运行不了
http://jingyan.baidu.com/article/1e5468f9033a71484961b7d7.html
安装
l 左下角桌面,右键-控制面板
l 点击“程序与功能”-
l 左边的“启用和或关闭widows功能”
l 勾上telnet客户端-确定就可以了-
运行
telnet 127.0.0.1 2347
随便发送信息,对方会回复一直是
hello
注意:
1、如果出现无法访问的情况,请参照手册常见问题-链接失败一节排查。
2、服务端是裸tcp协议,用websoket、http等其它协议无法直接通讯。
tcpdump抓包
26. 同步异步理解,待完善
同步就是程序得到结果后,才会继续执行后面代码。
异步就是程序不用等得到结果,可以继续执行后续代码
http://blog.csdn.net/nighted/article/details/6961333
async默认的设置值为true,这种情况为异步方式,当ajax发送请求后,在等待server端返回的数据的过程中,程序会继续执行ajax块后面的代码,直到服务器返回正确的结果才会去执行success的方法,也就是说程序会从两个方向去执行脚本。在这个程序里,执行是这样的,执行ajax的success方法,另一方面执行脚本2。显然,不能得到想要的结果。因为,执行顺序的问题。
当把asyn设为false时,这时ajax的请求时同步的。这样的话,只有ajax请求成功之后,才会执行脚本2。也就是说,这个时候,ajax的success方法没有执行的情况下,脚本2是不执行的,因为这个时候是async: false,即同步的。
=======
http://doc.workerman.net/315283
这样,繁重的任务交给本机或者其它服务器的进程去做,任务完成后会异步收到结果,业务进程就不会阻塞了。
同步,就算一个请求后,一直等待对方回应,做不了其他事,数据要一致交流
异步,就是先得到数据,存起来,自己处理一下。或者给别的服务器处理,返回来,在给别人
27. linux下workerman安装
选择linux版本
手册-安装-环境要求
http://doc.workerman.net/315115
Linux环境检查脚本
Linux用户可以运行以下脚本检查本地环境是否满足WorkerMan要求
curl -Ss http://www.workerman.net/check.php | php
Linux用户(含Mac OS)
Linux用户只能使用Linux版本的Workerman。
1、安装PHP>=5.3.3,并安装了pcntl、posix扩展
2、建议安装event或者libevent扩展,但不是必须的(注意event扩展需要PHP>=5.4)
Linux环境检查脚本
Linux用户可以运行以下脚本检查本地环境是否满足WorkerMan要求
curl -Ss http://www.workerman.net/check.php | php
如果脚本中全部提示ok,则代表满足WorkerMan运行环境
(注意:检测脚本中没有检测event扩展或者libevent扩展,如果并发连接数大于1024建议安装event扩展或者libevent扩展,安装方法参见下一节)
安装-下载安装-注意
必须安装pcntl和posix扩展:
开发流程-注意:
l header,setcookie等不适用
l 单例等资源释放
l 不要实现die,exit等
l 不要在主进程初始化数据库,redis,memcache链接资源,主进程资源共享了,这样会造成错乱
http://doc.workerman.net/315119
28. 查看window端口
netstat -ano
查看被占用端口对应的PID,输入命令:netstat -aon|findstr "49157",回车,记下最后一位数字,即PID,这里是2720
29. 目录结构
Workerman // workerman内核代码 ├── Connection // socket连接相关 │ ├── ConnectionInterface.php// socket连接接口 │ ├── TcpConnection.php // Tcp连接类 │ ├── AsyncTcpConnection.php // 异步Tcp连接类 │ └── UdpConnection.php // Udp连接类 ├── Events // 网络事件库 │ ├── EventInterface.php // 网络事件库接口 │ ├── Libevent.php // Libevent网络事件库 │ ├── Ev.php // Libev网络事件库 │ └── Select.php // Select网络事件库 ├── Lib // 常用的类库 │ ├── Constants.php // 常量定义 │ └── Timer.php // 定时器 ├── Protocols // 协议相关 │ ├── ProtocolInterface.php // 协议接口类 │ ├── Http // http协议相关 │ │ └── mime.types // mime类型 │ ├── Http.php // http协议实现 │ ├── Text.php // Text协议实现 │ ├── Frame.php // Frame协议实现 │ └── Websocket.php // websocket协议的实现 ├── Worker.php // Worker ├── WebServer.php // WebServer └── Autoloader.php // 自动加载类
30. 聊天案例
手册-开发流程-基本流程-里面的案例
http://doc.workerman.net/315122
例如下面这个是一个简单的聊天室的入口文件。
SimpleChat/start.php
<?php
use
Workerman
Worker
;
require_once
'/your/path/Workerman/Autoloader.php'
; $global_uid =
0
;
//
当客户端连上来时分配
uid
,并保存连接,并通知所有客户端
function
handle_connection
($connection)
{
global
$text_worker, $global_uid;
//
为这个链接分配一个
uid
$connection->uid = ++$global_uid; }
//
当客户端发送消息过来时,转发给所有人
function
handle_message
($connection, $data)
{
global
$text_worker;
foreach
($text_worker->connections
as
$conn) { $conn->send(
"user[{$connection->uid}] said: $data"
); } }
//
当客户端断开时,广播给所有客户端
function
handle_close
($connection)
{
global
$text_worker;
foreach
($text_worker->connections
as
$conn) { $conn->send(
"user[{$connection->uid}] logout"
); } }
//
创建一个文本协议的
Worker
监听
2347
接口
$text_worker =
new
Worker(
"text://0.0.0.0:2347"
);
//
只启动
1
个进程,这样方便客户端之间传输数据
$text_worker->count =
1
; $text_worker->onConnect =
'handle_connection'
; $text_worker->onMessage =
'handle_message'
; $text_worker->onClose =
'handle_close'
; Worker::runAll();
我的是先开一个cmd
cd D:phpStudyphpphp-7.0.12-nts
D:
php.exe D:wwwwkman
start.php
测试
Text协议可以用telnet命令测试
telnet 127.0.0.1 234
7
多开几个客户端cmdtelnet 127.0.0.1 234
7