zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    supervise 用来监控服务,自动启动
    tee -a /var/log/jd.log
    类的构造函数与析构函数的调用顺序
    c++之带默认形参值的函数
    zoj1001-A + B Problem
    zoj1037-Gridland
    cf499A-Watching a movie
    cf478B-Random Teams 【排列组合】
    C++版修真小说
    Python_12-线程编程
  • 原文地址:https://www.cnblogs.com/wujunbin/p/7468606.html
Copyright © 2011-2022 走看看