workerman 学习

介绍

Workerman是一款纯PHP开发的开源高性能的PHP socket 服务框架。

Workerman不是重复造轮子,它不是一个MVC框架,而是一个更底层更通用的socket服务框架,你可以用它开发tcp代理、梯子代理、做游戏服务器、邮件服务器、ftp服务器、甚至开发一个php版本的redis、php版本的数据库、php版本的nginx、php版本的php-fpm等等。Workerman可以说是PHP领域的一次创新,让开发者彻底摆脱了PHP只能做WEB的束缚。

实际上Workerman类似一个PHP版本的nginx,核心也是多进程+Epoll+非阻塞IO。Workerman每个进程能维持上万并发连接。由于本身常住内存,不依赖Apache、nginx、php-fpm这些容器,拥有超高的性能。同时支持TCP、UDP、UNIXSOCKET,支持长连接,支持Websocket、HTTP、WSS、HTTPS等通讯协议以及各种自定义协议。拥有定时器、异步socket客户端、异步Mysql、异步Redis、异步Http、异步消息队列等众多高性能组件

在tp5.0 框架中使用

# 检查环境是否ok
curl -Ss http://www.workerman.net/check.php | php
# 依赖 worker
composer require topthink/think-worker=1.0.*
# workerman 
composer require workerman/workerman=3.3.0

创建server.php 文件

<?php
#在 public 服务下面
define('APP_PATH', __DIR__ . '/../application/');
define('BIND_MODULE','admin/Worker'); // 模块/控制器
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

创建 Worker 文件

### 在application/admin/controller 目录创建 Worker 文件
<?php


namespace app\admin\controller;

use think\worker\Server;
use \Workerman\Connection\AsyncTcpConnection;

class Worker extends Server
{
    protected $socket =  "";//本地域名

    protected $modle = null;
    public function __construct(){
        $this->processes = 16;
        $this->socket = 'websocket://127.0.0.1:1234';
        parent::__construct(); // 启动 websocker 服务
    }

    /**
     * 收到信息
     * @param $connection
     * @param $data
     */
    public function onMessage($ws_connection, $data)
    {
        // 与远程task服务建立异步连接,ip为远程task服务的ip,如果是本机就是127.0.0.1,如果是集群就是lvs的ip
        $task_connection = new AsyncTcpConnection('Text://127.0.0.1:1235');
        // 发送数据 到异步服务处理
        $task_connection->send($data);
        // 异步获得结果
        $task_connection->onMessage = function($task_connection, $task_result)use($ws_connection)
        {
            // 结果 $task_result
            // 获得结果后记得关闭异步连接
            $task_connection->close();
            // 通知对应的websocket客户端任务完成
            $ws_connection->send($task_result);
        };
        // 执行异步连接
        $task_connection->connect();

    }

    /**
     * 当连接建立时触发的回调函数
     * @param $connection
     */
    public function onConnect($connection)
    {

    }

    /**
     * 当连接断开时触发的回调函数
     * @param $connection
     */
    public function onClose($connection)
    {
        echo "close";
    }

    /**
     * 当客户端的连接上发生错误时触发
     * @param $connection
     * @param $code
     * @param $msg
     */
    public function onError($connection, $code, $msg)
    {
        echo "error $code $msg\n";
    }

    /**
     * 每个进程启动
     * @param $worker
     */
    public function onWorkerStart($worker)
    {

    }
}

异步处理 创建 Asyncworker.php 文件


<?php

namespace app\admin\controller;

use think\worker\Server;
use \Workerman\Connection\AsyncTcpConnection;

class Asyncworker extends Server
{
  protected $socket = "";//本地域名

  protected $modle = null;
  protected $monitorviewController = null;
  public function __construct(){
  $this->processes = 16;
  $this->socket = 'Text://127.0.0.1235';//本地域名
  parent::__construct();
 }

 /**
 * 收到信息
  * @param $connection
 * @param $data
 */  public function onMessage($connection, $route)
 {  
     // 处理异步业务逻辑
     // 返回结果到 Worker 进程
    $connection->send("task ok");
 }
  /**
 * 当连接建立时触发的回调函数
  * @param $connection
 */  public function onConnect($connection)
 {
 }
  /**
 * 当连接断开时触发的回调函数
  * @param $connection
 */  public function onClose($connection)
 {//        echo "close";
  unset($connection);

 }
  /**
 * 当客户端的连接上发生错误时触发
  * @param $connection
 * @param $code
 * @param $msg
 */  public function onError($connection, $code, $msg)
 {  echo "error $code $msg\n";
 }
  /**
 * 每个进程启动
  * @param $worker
 */  public function onWorkerStart($worker)
 {
 }}

异步服务文件 serverAsync.php


define('APP_PATH', __DIR__ . '/../application/');
define('BIND_MODULE','admin/Asyncworker');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

启动服务

 // 进入public 目录

php serverAsync.php start -d
php server.php start -d

// 查看 状态
php server.php status
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
77
粉丝
8
喜欢
43
收藏
49
排名:84
访问:10.4 万
私信
所有博文
社区赞助商