您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
workerman系列之tp5(thinkphp5)日志结合workerman使用
发布时间:2022-01-13 23:59:58编辑:雪饮阅读()
就是最近用workerman部署的長連接,那麽業務推送經常是需要排查的,用php自帶的那個file_put_content這樣打日志顯然很低效,那麽如果能像thinkphp的log一樣好用就挺好哈。
於是乎翻看了thinkphp5的文檔,因爲我這邊一個項目就是基於thinkphp5的。並結合自己的理解在workerman中用log打印日志實現如:
<?php
use think\Log;
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
Log::init([
'type' => 'File',
'path' => 'runtime/log/'
]);
// 初始化一个worker容器
$worker = new Worker('websocket://0.0.0.0:8484');
/*
* 注意这里进程数必须设置为1,否则会报端口占用错误
* (php 7可以设置进程数大于1,前提是$inner_text_worker->reusePort=true)
*/
$worker->count = 1;
// worker进程启动后创建一个text Worker以便打开一个内部通讯端口
$worker->onWorkerStart = function($worker)
{
// 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
$inner_text_worker = new Worker('text://0.0.0.0:5678');
$inner_text_worker->onMessage = function(TcpConnection $connection, $buffer)
{
// $data数组格式,里面有to_uid,表示向那个uid的页面(前端websocket用户端)推送数据
$data = json_decode($buffer, true);
$uid = $data['to_uid'];
// 通过workerman,向uid的页面(前端websocket用户端)推送数据
$ret = sendMessageByUid($uid, $buffer);
// 返回推送结果给内部系统发起推送者
$response["msg"]=$ret ? 'ok' : 'fail';
$connection->send(json_encode($response));
};
// ## 执行监听 ##
$inner_text_worker->listen();
//内部通信worker监听完成
};
// 新增加一个属性,用来保存uid到connection的映射
$worker->uidConnections = [];
// 当有websocket客户端发来消息时执行的回调函数
$worker->onMessage = function(TcpConnection $connection, $data)
{
global $worker;
$data=json_decode($data,true);
if($data["type"]=="buildConnect"){
$connection->uid=$data["uid"];
$worker->uidConnections[$connection->uid] = $connection;
//绑定连接成功响应
$array_keys=array_keys($worker->uidConnections);
$connectResponse["type"]="buildConnectSuccess";
$connectResponse["data"]=$array_keys;
/*
$clients=[];
if($worker->uidConnections){
foreach($worker->uidConnections as $key=>$val){
$tmp["key"]=$key;
// $tmp["val"]=get_object_vars($val);
$clients[]=$tmp;
}
}
*/
Log::write('长连接:当前连接集合:'.var_export($array_keys,true),'notice');
$connection->send(json_encode($connectResponse));
}
if($data["type"]=="pay_success_notice_receive"){
if(isset($connection->uid))
{
// 删除连接
unset($worker->uidConnections[$connection->uid]);
$connection->close();
}
}
else{
if(isset($data["to_uid"])){
$to_uid=$data["to_uid"];
$ret=sendMessageByUid($to_uid,json_encode($data));
$response["msg"]=$ret ? 'ok' : 'fail';
$connection->send(json_encode($response));
}
}
};
// 当有客户端连接断开时
$worker->onClose = function(TcpConnection $connection)
{
global $worker;
if(isset($connection->uid))
{
// 连接断开时删除映射
unset($worker->uidConnections[$connection->uid]);
}
};
// 针对uid推送数据
function sendMessageByUid($uid, $message)
{
Log::write('长连接:发送给用户 uid:'.$uid." message:".$message,'notice');
global $worker;
$res=isset($worker->uidConnections[$uid]);
Log::write('长连接:发送给用户 uid:'.$uid." 用户存在?:".var_export($res,true),'notice');
if($res)
{
$connection = $worker->uidConnections[$uid];
$connection->send($message);
return true;
}
return false;
}
// 运行所有的worker
Worker::runAll();
這個php文件需要和thinkphp的那個vendor目錄同級存在,然後自己的workerman在這個vendor目錄中能加載過來即可。
关键字词:workerman,日志,tp5,thinkphp5
相关文章
- workerman常见问题-php的几种回调写法-类的静态方法作
- workerman常见问题-php的几种回调写法-类方法作为回调
- workerman常见问题-php的几种回调写法-普通函数回调
- workerman作爲客戶端系列之socket5即s5代理搭建基於ce
- workerman作爲客戶端系列之http代理搭建
- workerman作爲客戶端-作爲ws或wss客戶端-做為ws客戶端
- workerman創建https服務(普通請求轉https請求,基於寶塔
- workerman創建https服務
- workerman創建wss服務(基於apache基於phpstudy環境)
- workerman創建wss服務-(配置于nginx上作爲nginx的locat