workerman

八Wokerman

http://www.workerman.net/

25. windos下测试

下载windos版的Wokerman

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

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

<?php use WorkermanWorker;
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');
};
// 运行workerWorker::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 WorkermanWorker;
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);
};
// 运行workerWorker::runAll();

命令行运行

php ws_test.php start 我的是

cd D:phpStudyphpphp-7.0.12-nts
D:
php.exe D:wwwwkmanws_test.php
 

测试

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

// 假设服务端ip127.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 WorkermanWorker;
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);
};
// 运行workerWorker::runAll();

命令行运行

php tcp_test.php start

我的是

cd D:phpStudyphpphp-7.0.12-nts
D:
php.exe D:wwwwkmantcp_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 WorkermanWorker;
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:wwwwkmanstart.php

测试

Text协议可以用telnet命令测试

telnet 127.0.0.1 2347
多开几个客户端cmd telnet 127.0.0.1 2347
原文地址:https://www.cnblogs.com/wujunbin/p/7468606.html