Medoo+swoole组合

基于Swoole的异步消息发送(短信、邮件等)PHP Yaf 本文只做自己学习笔记记录,如有涉及他人版权,请联系我第一时间修改删除 阅读详情

前言

本篇重点是Medoo的断线重连和主从读写,没啥swoole的内容

Medoo

  1. medoo是什么 : 我觉得就是个封装好了PHP使用PDO操作数据库的一个框架;
  2. github地址
  3. medoo使用文档
swoole断线重连描述

-----------------------------------------下面是一张图片-------------------------------------------------
swoole关于mysql断线重连的说明
-----------------------------------------图片结束-------------------------------------------------

描述:

用swoole 的相信都遇到过这个问题,我的解决方案是找到Medoo代码中所有sql执行的最终位置,
然后再那里捕获到 2006 的异常, 然后进行重连
最终发现是下面这个函数

public function exec($query, $map = [])
	{
		try{		
			if ($this->debug_mode)
			{
				echo $this->generate($query, $map);

				$this->debug_mode = false;

				return false;
			}

			if ($this->logging)
			{
				$this->logs[] = [$query, $map];
			}
			else
			{
				$this->logs = [[$query, $map]];
			}

			@$statement = $this->pdo->prepare($query);

			if ($statement)
			{
				foreach ($map as $key => $value)
				{
					$statement->bindValue($key, $value[ 0 ], $value[ 1 ]);
				}

				$statement->execute();
				$this->statement = $statement;
				return $statement;
			}
		} catch(\PDOException $e){
			// 这段代码是我写得
			if(in_array($e->errorInfo[1], [2006,2013])){ // 重新连接
				$useDbConfig = require(ROOT_PATH . '/config/common.php');
				if(strpos($query, 'SELECT') === 0){ // 主从区分, 目前这个区分个人感觉不是很好,如果有好建议的大神, 还请赐教,我先谢谢了
					// getDbConfig() 这个函数实现在下面
					self::$_readInstance = self::getInstance(getDbConfig($useDbConfig, 'slave'),'slave', $this); // 只读
					return self::$_readInstance->exec($query, $map);
				}else{
					self::$_instance = self::getInstance(getDbConfig($useDbConfig, 'default'),'default', $this); // 写
					return self::$_instance->exec($query, $map);
				}
			}
		}
		return false;
	}
PDO 连接的属性和option如下(getDbConfig()函数声明)
function getDbConfig($useDbConfig, $key)
{
    $defaultDb = $useDbConfig['mysql'][$key];
    $dbConf = [
        'database_type' => 'mysql',
        'database_name' => $defaultDb['db'],
        'server'        => $defaultDb['host'],
        'username'      => $defaultDb['user'],
        'password'      => $defaultDb['pwd'],
        'port'          => $defaultDb['port'],
        'charset'       => 'utf8',
        'option'        => [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,//需要将错误处理模式,变为异常模式, 这个可以让其抛出2006的错误
            PDO::ATTR_STRINGIFY_FETCHES  => false,// 提取的时候将数值转换为字符串。
            PDO::ATTR_EMULATE_PREPARES => false, // 启用或禁用预处理语句的模拟。 
            PDO::ATTR_PERSISTENT => true, // 持久化链接
            PDO::MYSQL_ATTR_USE_BUFFERED_QUERY  => true, // 使用缓冲查询 

        ]
    ];

    return $dbConf;
}
Medoo的单例和websocket中使用遇到的, 单例失效问题

个人比较喜欢贴代码说话如下:

// 记得要将构造函数私有化, 下面是单例实现, 这段代码贴到Medoo里面即可
	private static $_instance; // 写对象
	private $_instanceVersion; // 写对象的版本号
	private static $_readInstance; // 只读对象
	private $_readInstanceVersion; // 只读对象版本号
/**
	* 获取Medoo的单例
	* @param $nowConnct : 调用的当前Medoo对象, 防止当前进程的mysql连接可用的时候,又重新PDO连接; 利用对象版本号作为区分
	*/
	public static function getInstance($dbConf, $key, $nowConnct=NULL)
	{
		if($key == 'default'){
			if(!is_null($nowConnct)){ // 这里只有 断线重连才会触发(errorCode:2006)
				// nowVersion == newVersion : 当前的和最新的版本号一致,那么重新连接然后更新版本号;
				if($nowConnct->_instanceVersion == self::$_instance->_instanceVersion){ 
					self::$_instance = NULL; // 这个设置空,就会自动重新连接
				}
			}
			if(is_null(self::$_instance)) {
				self::$_instance = new self($dbConf);
				// getMillisecond() 我自己定义的一个获取毫秒时间戳的函数,你们可以用你们自己设计的
				self::$_instance->_instanceVersion = getMillisecond(); // 更新版本号
				__accessLog('Version : ' . self::$_instance->_instanceVersion);
			}
			return self::$_instance;
		}
		elseif ($key == 'slave') {
			if(!is_null($nowConnct)){
				if($nowConnct->_readInstanceVersion == self::$_readInstance->_readInstanceVersion){ 
					self::$_readInstance = NULL;
				}
			}
			if(is_null(self::$_readInstance)) {
				self::$_readInstance = new self($dbConf);
				self::$_readInstance->_readInstanceVersion = getMillisecond();

			}
			return self::$_readInstance;
		}
	}

这里讲一下对象版本号的作用, 就是这两个属性:
_instanceVersion;_readInstanceVersion (其实是一样的作用)
websocket 中我发现下面的现象:

多次连接的异常是:
系统连续发出三个查询: a b c
a 发现断了, 然后它就重连在查询, 然后完毕
b 也发现断了, 然后它也重连在查询, 然后完毕
c 也发现断了, 然后它也重连在查询, 然后完毕
问题是: 这里不应该b,c 也重连, 因为a 拿到了最新的连接, 应该把这个连接直接给b,c即可;因为单例了啊;

解决方案:
需要保证 a 重连的时候, b,c的连接也能拿到最新的
然后我设计了对象版本号, 原理如下:
a重连的时候会将单例里面的对象变成最新的, b,c执行sql的时候会发现2006了,此时他们肯定走异常重连处理;如果我能把a产生的对象给他们就ok了

如果我给每次的对象都加上版本号使用的时候就可以:

a,b,c 同时执行查询的时候他们的对象都是A对象本号是100: 简写 A(100)
执行查询的时候 a 查询发现2006, 然后走了重连
重连之前我加了版本好判断: a 查询用的是 A(100), 单例里面是 A(100)
对比发现是同一个对象, 这时候 就产生一个新的 对象 A(101) 返回给 a 查询去使用

这时候 b 查询开始了:

b 查询带着 A(100) 他发现2006了, 走重连;
重连之前判断下版本号, 发现: b 查询用的是 A(100) , 单例里面已经是 A(101)
对比, 发现 版本号不一致; 就表示, 有新的 对象可用, 那么 b 查询就不重连连接了,直接拿着 a 查询产生的 A(101) 使用就可以了

结语:

具体的代码实现可以看上面的单例实现就可以了
第一次设计, 如果有更好的方案,或者有些别的框架已经实现的思路也请各位看官告知我, 谢谢大佬先;
小弟邮箱: 917841572@qq.com

swoole+yaf 实现定时执行任务     在开发过程中,经常需要有每隔多少分钟就执行一次任务的需求,本文讲的就是在yaf下使用命令行的形式(cli模式)定时运行脚本文件,换而言之就是在cli模式下运行模块控制器的方法。例如在linux环境下通过/usr/local/php/bin/php /home/wwwroot/swoole-yaf/cli.php Cli~Test/index这条指令就可以运行我的Cli模块下的Test控制器... 阅读详情

相关推荐

Medoo 1.6 文档 中文版 PDF 自带书签( Medoo 高效的轻量级PHP数据库框架, 提高开发效率)

Medoo是一款高效的轻量级PHP数据库框架, 提高开发效率! 此资源是其中文文档版本为1.6 兼容最新版1.6.1

国产达梦数据库(DM)安装教程及使用

本文章主要讲解达梦数据库安装使用,后续更新下如何使用达梦管理工具进行连接

Eugene_kwj的博客 6460

swoole-yaf, 结合swoole扩展和Yaf框架,使用swoole的内置http_server.zip

swoole-yaf, 结合swoole扩展和Yaf框架,使用swoole的内置http_server

swoole swoole_http yaf medoo 微信

被一个问题困扰了一个多月了,发在这里牢骚一下. 我有个swoole_http服务,与微信对接的. 主要做的工作就是在用户关注和取消关注时把微信用户的信息保存和更新. 但我发现一个问题. 在这个服务跑了大概一两天之后, 就会连不上数据库. 导致所有对数据库的操作都失败. 但是没有报任何错误和异常(这个是最诡异的,我查看了所有的错误日志). 比如查询一个用户是否存在, 数据库明明是有的,却查不

Yuhao的专栏 1953

多标签损失之Hamming Loss(PyTorch和sklearn)、Focal Loss、交叉熵和ASL损失

多标签损失

wuli_xin的博客 4461

Ubuntu22.04下RTX2080显卡驱动、CUDA、cuDNN保姆级避坑安装指南(实测有效)

本文提供Ubuntu22.04下RTX2080显卡驱动、CUDA和cuDNN的详细安装指南,涵盖前期准备、驱动安装、CUDA版本选择、cuDNN配置及常见问题解决。通过实测有效的步骤和优化建议,帮助用户快速搭建稳定的深度学习环境,避免常见陷阱。

weixin_42540248的博客 284

PHP连接DM达梦数据库

PHP连接达梦数据库 在使用PHP连接达梦数据库的时候,遇到了以下问题,希望可以帮助大家: 1:首先,在使用HPH连接达梦数据库的时候,请要参考达梦数据库的DM程序员手册中PHP相关章节,能避免很多不必要的错误。该手册在安装目录的DOC目录下。 2 PHP客户怎么清楚自己下载的php版本?/哪里下载? 未安装用户:进入:https://www.php.net/ 可下载,安装包有对应版本号。建议使用达梦已支持的版本。 已安装用户,可在命令行查询:(如下图Python2.7.15) 3: ubuntu系统

weixin_45699851的博客 2867

模电学习笔记(十二)——跨阻放大器

模电学习笔记(十二) 跨阻放大器 跨组运算放大器是将电流信号转换成为电压信号,电流到电压增益基于反馈电阻。 设计目标: 输入 输出 带宽 电源 0A 100uA 0V 7V 20kHz 15V -15V 1.计算R1的值(增益电阻器) 2.计算C1的值满足电路带宽 ...

tang11081023的博客 2万+

【JDBC】JDBC和连接池的关系

1. 前言 一直以为连接池是对JDBC的封装,今天再次回顾Java基础的时,才发现并非完全如此。连接池只是包装/操作了JDBC API 接口,然后再实际运行的时候,这些接口的具体实现则 下面是知乎上的一个图:JDBC和连接池的关系 2. JDBC和连接池的关系 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。简单说可以通过JDBC来访问数据库, 而连

pangpd的博客 2639

使用GEOquery包下载原始数据

使用GEOquery包下载原始数据

m0_75172651的博客 1887

Android开发中StateFlow与LiveData的5个关键区别及实战避坑指南

本文深度解析了Android开发中StateFlow与LiveData的5个核心区别,包括设计哲学、生命周期管理、值更新策略、线程模型及协程生态整合。通过实战代码对比,为开发者在现代MVVM架构下的状态管理选型提供清晰的决策指南和避坑建议,帮助构建更健壮、可测试的应用。

weixin_29012677的博客 402

Medoo数据库基本操作

Medoo查询操作 基本语法: select(表名,字段列表,查询条件) 字段采用数组格式,单字段可使用字符串 查询条件必须采用数组格式 返回数组格式 创建一个公共文件 connect.php ...

wjh-yalta的博客 1093

HFSS实战项目——GPS北斗双模微带天线

本文设计了一款方形圆极化微带天线应用于北斗B1和GPSL1频段,满足高增益、低VSWR、适当方向图等要求。设计中心频率为1568MHz,介质板采用厚度h=1.6mm的Arlon AD450(tm)板,相对介电常数为4.5,采用探针馈电。

2401_87464239的博客 1766

medoo连接mysql_Medoo入门:安装和配置-Medoo使用指南

Medoo是什么呢?看看官方是怎么写的:The Lightest PHP database framework to accelerate development!//译:加速开发的最轻量的PHP数据库框架!Medoo的口号还是喊得很响的,实际上是否真的好用呢?经过一段时间的使用,我发现Medoo真的就像官方介绍的那样,可以极大地加快你的PHP项目的开发。在进行Web开发的时候,很大一部分企业或...

weixin_33454080的博客 554

养龙虾之_因特尔UHD/ULtra/Arc核显跑大模型_安装ollama_跑qwen3.5:0.8b/9b_使用copaw1.0.1测试_并配置copaw技能效果炸裂---AI大模型应用探索0019

摘要:本文探讨了利用Intel UHD770核显运行大语言模型的可能性。通过使用Intel发布的ipex-llm项目工具包,成功在核显上运行了Qwen3.5系列模型。测试发现0.8B小模型运行流畅(3-5秒响应),但智能程度有限;而9B大模型虽然效果更好,但响应时间长达2分钟,且GPU/CPU占用率不高。实验证明Intel核显确实可以运行LLM,但实际效果和性能表现仍有提升空间,特别是对大模型的支持尚不理想。

添柴程序猿的专栏 231

YOLOv12超参数智能优化:基于内置Ray Tune的自动化调优实战指南

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有! 目标检测模型的性能瓶颈往往源于超参数配置不当。传统手动调优方式不仅耗时耗力,且难以找到全局最优解。YOLOv12集成的Ray Tune框架为解决这一难题提供了完整方案,通过分布式异步优化算法,可实现超参数搜索效率的指数级提升。实际测试表明,采用Ray Tune自动调优的YOLOv12模型,在COCO数据集上mAP指标平均提升3.8%,收敛速度加快2.1倍。在VisDrone无人机数据集上的跨域测试

LXY_LOVE36的博客 118

medoo连接mysql_Medoo Info的使用:输出SQL连接信息

info方法:info(),无需传入任何参数,返回值为数组:Array(),即为数组形式的数据库信息返回的内容中,如果是PHP连接数据库成功,就会返回数组,失败则直接PHP报错本方法并非调试SQL的方法以下以官网示例进行完整说明(部分可能经过修改)使用方法://实例化Medoo类$database = new medoo("my_database");//直接调用,打印输出即可print_r($d...

weixin_32515349的博客 339

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Medoo Get的使用:查询单条数据

get方法:get($table, $columns, $where),接受三个参数的传入 第一个需要传入的参数为字符串:String,即为要查询的数据表名 第二个需要传入的参数类型为字符串或数组:String/array(),即为要查询的字段,单个字段就用String,多个字段用array() 第三个需要传入的参数为数组:array(),即为查询条件 凡事用到get方法,

PHP开发实践 2738

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Laravel通过Swoole提升性能

1、安装配置laravel 1.1、composer下载laravel composer create-project --prefer-dist laravel/laravel blog "5.5.*" 1.2、给storage目录和bootstrap/cache目录配置读写权限 chmod -R 777 storage chmod -R 777 bootstra...

weixin_34261415的博客 1454

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Medoo轻量级的数据库框架

Medoo是一个开源超轻量级的 PHP SQL 数据库框架,提供简单,易学,灵活的 API,用于提升开发 Web 应用的效率与性能。 与其它同类的产品相比,Medoo 最大的优势就在于其轻量级(只有一个文件,并且体积只有 8KB 左右),以及配置和 API 都非常简单易用,而且还能支持多种数据库。 在当今 Web 应用后台开发的流程中,与数据库之间的数据交换是极为重要的一环,尤其是 S

亦风的家园 1030

swoole tcp服务端搭建与客户端访问:

require 'vendor/autoload.php'; use Medoo\Medoo; //创建Server对象,监听 0.0.0.0:2345端口 $serv = new Swoole\Server("0.0.0.0", 2345); //监听连接进入事件 $serv->on('Connect', function ($serv, $fd) { echo "Client:...

qq1714594061的博客 360

yaf使用swoole

//这个是你入口文件,swoole.php define("APP_PATH", realpath(dirname(__FILE__) . '/../')); $app = new Yaf_Application(APP_PATH . "/conf/application.ini"); //这样可以像使用普通的url请求一样正常加载所有的类和model等等文件 $app->bootstr...

zhyke 2204

swoole coronute 连接池复用

swoole cronoute

zztIsGood的博客 1758

medoo数据库插入的问题

今天遇到疾行客同学提出的medoo insert方法不能插入数据库问题,我测试了一下 发现是可以的 而INSERT INTO "t_user" (username) VALUES ('test'); 这条语句总是无法执行,而medoo总是会帮你把数据库的表加上双引号 但是在命令行中无法执行。后来我搞不懂为啥medoo可以执行,发现了一个问题 SET SQL_MODE=ANSI_QUOTES 在...

weixin_33892359的博客 358

Medoo入门

Medoo作为一个PHP微型框架,确实非常小,下载以后只有一个medoo.php,你可以在官网上下载开发版或者压缩版。 官网:medoo.in 注意:建议你的PHP版本>=5.4,否则需要改框架,很烦。 一.连接数据库就这么简单,支持多种数据库 require 'medoo.php'; $database = new medoo([ // required 'data

一生悬命 1747

Medoo 微框架的细节小坑

1. insert() 返回值 结论:insert() 、update()、 delete() 三个函数都将会返回一个pdo对象。 使用 Medoo 1.4.5 微框架时,根据中文文档,调用 $database->insert() 函数时,返回值如下: Return: [number] 返回插入的id 该返回似乎与 1.2 的旧版本一致,但实际返回值不是id, 而是一个PDOS...

ParrySMS 3923
上一篇: 最新JS和PHP交互AES加密解密数据
下一篇: 初识go的chan
codeDig
博客等级 码龄10年 3粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值