中文在线一区二区_欧美在线综合_久久久久久综合_欧美一区二区三区视频_国产免费看_国产福利精品一区

TP ORM使用問題

由于swoole 是在常駐內(nèi)存+協(xié)程環(huán)境下運(yùn)行的,使用TP ORM 時(shí),TP ORM自帶了很多靜態(tài)變量,將會(huì)出現(xiàn)問題,具體分析如下:

非協(xié)程常駐內(nèi)存模式

在同步,非協(xié)程模式下,一個(gè)worker在一個(gè)時(shí)間內(nèi)只處理一個(gè)請(qǐng)求,到max_request時(shí)也將重啟進(jìn)程,可以勉強(qiáng)操作sql,但是以下靜態(tài)變量會(huì)出現(xiàn)問題:

think\Db 靜態(tài)變量:

protected static $config = [];
//數(shù)據(jù)庫配置,幾乎沒有影響

protected static $query;
//查詢類名,沒有影響

protected static $queryMap = [
    'mongo' => '\\think\\db\Mongo',
];
//查詢類自動(dòng)映射,沒有影響

public static $queryTimes = 0;
//數(shù)據(jù)庫查詢次數(shù)
//常駐內(nèi)存下是全局查詢次數(shù)

public static $executeTimes = 0;
//執(zhí)行次數(shù)
//常駐內(nèi)存下其實(shí)是全局執(zhí)行執(zhí)行次數(shù)

protected static $cacheHandler;
//緩存對(duì)象,沒有影響

think\Model 靜態(tài)變量:

protected static $initialized = [];
//初始化過的模型.
//原本作用:確保一個(gè)模型類中的init方法在一次請(qǐng)求中只被執(zhí)行一次
//常駐內(nèi)存下:一個(gè)模型只在第一次請(qǐng)求時(shí)執(zhí)行該方法,后續(xù)請(qǐng)求不再執(zhí)行,極有可能會(huì)造成bug

protected static $readMaster;
//是否從主庫讀取數(shù)據(jù)
//幾乎沒有影響

think\db\Connection 靜態(tài)變量:

protected static $instance = [];
//PDO操作實(shí)例
//建立的連接管理實(shí)例
//協(xié)程模式,高并發(fā)下可能會(huì)導(dǎo)致數(shù)據(jù)庫操作bug

protected static $event = [];
//監(jiān)聽回調(diào)
//原本作用:給模型設(shè)置的事件回調(diào)
//常駐內(nèi)存下:隨著運(yùn)行時(shí)間不斷增加將不斷增加運(yùn)行內(nèi)存,一次請(qǐng)求增加的事件將影響到另外一次請(qǐng)求

protected static $info = [];
// 數(shù)據(jù)表信息
// 幾乎沒有影響

protected static $log = [];
// 數(shù)據(jù)庫日志
// 原本作用: 記錄一個(gè)請(qǐng)求的所有日志操作
// 常駐內(nèi)存: 隨著數(shù)據(jù)庫的不斷操作,會(huì)使該變量不斷增加,會(huì)造成內(nèi)存溢出

think\db\Query 靜態(tài)變量:

protected static $connections = [];
// 數(shù)據(jù)庫Connection對(duì)象
// 暫時(shí)沒發(fā)現(xiàn)使用的地方

private static $event = [];
//回調(diào)事件
//原本作用:一次請(qǐng)求下,設(shè)置自身的回調(diào)事件
//常駐內(nèi)存下:一次請(qǐng)求增加的事件將影響到另外一次請(qǐng)求

private static $extend = [];
//擴(kuò)展查詢方法
//幾乎沒有影響

private static $readMaster = [];
//需要讀取主庫的表
//原本作用:設(shè)置某一個(gè)或者全部模型是否從主庫讀取數(shù)據(jù)
//常駐內(nèi)存下:如果在一個(gè)請(qǐng)求執(zhí)行了Query::readMaster()方法,Query::$readMaster不會(huì)釋放,將會(huì)影響到其他請(qǐng)求

think\Db\ModelEvent 靜態(tài)變量:

private static $event = [];
// 回調(diào)事件
//原本作用:給模型設(shè)置的事件回調(diào)
//常駐內(nèi)存下:隨著運(yùn)行時(shí)間不斷增加將不斷增加運(yùn)行內(nèi)存,一次請(qǐng)求增加的事件將影響到另外一次請(qǐng)求

protected static $observe = ['before_write', 'after_write', 'before_insert', 'after_insert', 'before_update', 'after_update', 'before_delete', 'after_delete', 'before_restore', 'after_restore'];
//模型事件觀察
//沒有影響

協(xié)程常駐內(nèi)存模式

在協(xié)程模式下,多個(gè)客戶端共用一個(gè)數(shù)據(jù)庫連接,將會(huì)出現(xiàn)數(shù)據(jù)庫操作異常問題, 例如:

  • 用戶A訪問業(yè)務(wù)A,數(shù)據(jù)庫開啟事務(wù)->支付邏輯->完成事務(wù)
  • 用戶B同時(shí)訪問業(yè)務(wù)B,插入n條數(shù)據(jù)
  • 用戶C同時(shí)訪問業(yè)務(wù)A,數(shù)據(jù)庫開啟事務(wù)->支付邏輯->邏輯出錯(cuò),回滾

在這個(gè)邏輯中,由于都是共享一個(gè)數(shù)據(jù)庫操作,并且受協(xié)程切換影響,數(shù)據(jù)庫執(zhí)行步驟可能會(huì)變?yōu)? 用戶A數(shù)據(jù)庫開啟事務(wù)->用戶B插入n條數(shù)據(jù)->用戶C開啟事務(wù)->用戶A支付邏輯->用戶C支付邏輯->用戶C邏輯錯(cuò)誤,回滾事務(wù)->用戶A完成事務(wù)
當(dāng)數(shù)據(jù)庫這樣執(zhí)行時(shí),用戶A,B,C的所有數(shù)據(jù)庫操作都將回滾,但是前端可能卻會(huì)返回成功.

同樣,由于靜態(tài)變量共用,其他回調(diào)事件等問題同樣存在

主站蜘蛛池模板: 日韩一二三 | 欧美精品网站 | 色人在线| 国产精品精品 | 天堂中文av | 免费观看日本视频 | av不卡在线 | 一级片免费在线观看视频 | 久在线看 | 亚洲欧美在线播放 | 精品中文字幕一区 | 免费观看a视频 | 日韩精品免费 | 精品国产精品三级精品av网址 | 国产欧美日韩在线观看 | 国产精品美女av | 黄色电影在线免费观看 | 欧美成人久久久免费播放 | 精品国产不卡一区二区三区 | 久久亚洲一区二区三区明星换脸 | 国产一区二区三区欧美 | 日韩在线一区二区三区免费视频 | 男女全黄一级一级高潮免费看 | 日本理伦片午夜理伦片 | 国产精品久久天天躁 | 欧美视频二区 | 亚洲成人久久久 | 黄色三及毛片 | 欧美日韩在线免费 | 高清中文字幕 | 国产伦理一区 | 午夜电影网| 亚洲精品久久久久久久久久吃药 | 日韩欧美一区二区免费 | 在线视频 亚洲 | 免费黄色电影在线观看 | 国产欧美日韩三级 | 欧美国产激情二区三区 | 日本不卡一区二区三区在线观看 | 久久大伊人 | 色猫猫国产区一区二在线视频 |