介绍
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