easyswoole - 基于swoole扩展实现的一款高性能php框架

開發者必讀

此部分對于 ORM 的學習和使用非常重要。遇到使用問題時,請先確保自己認真看完了 ORM 組件的所有使用文檔,在對問題進行排查后,實在不能解決時再進行提問和反饋。

設計思想

ORM 全稱:object relational mapping,目的是想像操作對象一樣去操作數據庫,是符合面向對象開發思想的。

如將一條數據的插入,映射成一個對象的實例化。偽代碼如下所示:

<?php
$user = new UserModel();
$user->setData([
    'attr' => 'value'
]);
$user->insert();

常見問題匯總

重復使用 Model 對象

一個對象映射一條數據,此時會有很多用習慣了 db 封裝組件的小伙伴把 Model 當成了 db 封裝使用,重復調用一個 Model 對象,如下所示:

<?php
// 錯誤使用

// 假設id自增
$user = new UserModel();

// 插入一條新用戶
$user->setData([
    'attr' => 'value'
]);
$user->insert();

// 插入第二條新用戶,此時由于重復調用同一個對象,產生報錯,自增 id 主鍵重復
$user->setData([
    'attr' => 'value2'
]);
$user->insert();

ORM 生成復雜 sql

  1. ORM 是基于 mysqli 3.x 組件實現,內部引用 mysqli 組件中的 QueryBuilder 類 完成 sql 的構造,并且在 QueryLimit 章節 注明了閉包函數使用方式(可直接使用 mysqli 組件中的絕大部分連貫操作,如 having 等特殊條件)

  2. 如果 mysqli 組件的連貫操作也無法滿足您的需求,您有以下幾種方式解決該問題:

    • 使用自定義 sql 執行
    • 嘗試給組件貢獻代碼,新增功能特性
    • 提出反饋,我們會在精力允許和大眾所需時,對組件進行維護升級

優雅刪除數據

ORM 設計思想中,對數據的操作映射為對對象的操作,如果按照此原則,那么需要我們先查詢出對象,然后再調用對象的 delete() 方法進行刪除。

但是對于執行效率的消耗來說,此次查詢在部分業務場景下是無用的。

那么我們到底是否需要遵守設計原則?一般情況下是在 操作前需要校驗數據是否存在 時遵守,無需校驗則直接根據刪除條件傳參刪除即可。

設計原則代表思想,在某些場景下遵守它需要付出一定代價,開發者可以根據喜好去決定是否遵守。

刪除數據偽代碼如下所示:

<?php
$user = (new UserModel())->get($param['id']);

if (!$user){
    return '操作數據不存在,請檢查再試';
}

$res = $user->delete();

連接預熱

為了避免連接空檔期突如其來的高并發,我們可以對數據庫連接預熱,也就是 Worker 進程啟動的時候,提前準備好數據庫連接。

具體使用可查看 連接預熱 章節

斷線問題

為什么會斷線?

在連接池模式下,一個連接創建后,并不會因為因為請求結束而斷開,就好比 php-fpm 下的 pconnect 特性一樣。而一個連接建立后,可能會因為太久沒有使用(執行 sql ),而被 mysql 服務端主動斷開了連接,或者是因為鏈路問題,切斷了連接。而連接被切斷的時候。我們并不知道這件事。因此就導致了我們用了一個斷線的數據庫連接去執行 sql,從而出現斷線錯誤或者異常。

如何解決短線問題?

java 全家桶的原理一致,我們需要做的事情就是:

  • 定時檢查連接是否可用
  • 定時檢查連接的最后一次使用狀態

因此在 EasySwooleORM 中,ORM 組件提供了 IntervalCheckTime 配置項,它指定的就是多久做一次周期檢查,MaxIdleTime 配置項指的是如果一個連接超過這個時間沒有使用,則會被回收。AutoPing 配置項指的是多久執行一個 select 1 用來觸發這個連接,讓這個連接被 mysql 服務端標記為活躍而不會被回收。如果經常出現斷線,可以適當縮短 周期性檢查AutoPing 的時間(即調整 IntervalCheckTime、AutoPing 配置項的值)。

百分百不會斷線了?

理論上,做了上面的步驟,出現使用斷線連接的概率是非常低的,但是并不是真的就百分百穩了,比如極端情況:mysql 服務重啟,或者是鏈路斷線了。因此,我們一定要做類似如下這樣的處理措施:

<?php
try {
    $client = $pool->getClient();
    $cilient->query(xxxxxx);
} catch (\Throwable $t) {}

也就是說,任何 orm 的使用,一定要 try。至于為何,請參考 java 為何強制對任何數據庫 iotry 處理。

為何不能做自動重連

我們可以看到,在某些自以為很聰明的框架中,有下面這樣的操作:

<?php
$client = $pool->getClient();
try {
    return $client->query();
} catch(\Throwable $t) {
    // 2006 2002 為斷線
    if ($client->getError() == '2006') {
        $client->connect();
        return $client->query();
    } else {
        throw $t;
    }
}

乍一看,沒有什么問題。實際上,按照上面的重連,我們來看看下面的偽代碼:

<?php
$client = $pool->getClient();
$client->startTransaction();
$client->query(query one);
// client disconnect case network
$client->reconnect();
$client->query(query two);
$client->commit();

這樣,在極端情況下,會導致 query one 結果丟失,但是 query two 卻執行了,這對于事務來說,是不可原諒的。此刻又會有人說,那我判斷下鏈接是不是在事務中不就好了。實際上,遠遠沒這么簡單。為此,最好的方式就是我們養成良好的習慣。任何的數據庫 io,都做 try 操作,與 java 一致。

主站蜘蛛池模板: 汽车漆品牌|家具漆代理|涂料加盟厂家|家具漆|汽车漆-邦派漆官网 汽车漆|汽车油漆|工业油漆涂料|汽车漆加盟-佛山市科涂涂料有限公司 | 园林绿化平台|园林绿化网|苗木网|苗圃网||苗木报价网|园林招标网|园林苗木网|园林工程网|景观设计网|园林机械网|绿化苗木网| | 贴片磁胶电感_一体成型电感_贴片共模电感_广东精密龙电子科技有限公司 | 四字成语大全6000个,经典成语大全及解释,1000个50000个成语及解释 - 同鑫成语网 | 网上配音_免费配音_广告专题配音_网络录音网站【海豚配音】 | 磨粉设备_雷蒙磨粉机_雷蒙超细磨 | 抛丸机-通过式抛丸机-履带吊钩式抛丸机厂家-青岛泓霖智能设备公司 | 乐贝贝童装批发网-外贸童装批发厂家直销|网上品牌童装批发市场|儿童服装批发首选 | 泰安兴润建材有限公司,泰安井盖定做,泰安警示桩定做,泰安雨水篦子定做,泰安操场篦子定做,泰安标志牌定做 | 十树品牌策划—品牌战略、品牌策划、品牌定位、品牌设计、包装设计、品牌营销-上海十树品牌管理咨询有限公司官网 | 石牌坊价格_石雕农村门楼图片_石牌楼雕刻制作 _ 长城石雕 | 吸管包装机_塑料杯包装机_纸杯包装机_吸管挤出机_温州恩博机械有限公司 | 亚克力游泳池_透明/空中/无边泳池_别墅亚克力泳池设计生产厂家_瑞地格乐-深圳他拍档 | 沼气池-沼气设备-沼气工程-山东达禹环境工程有限公司 | 上海五相仪器仪表有限公司-鼓风干燥箱-拍击式无菌均质器生产厂家 | 乌海市腐植酸盐加工,内蒙古腐植酸钠,内蒙古型煤粘合剂生产厂家|创联腐植酸盐加工有限公司 | 上海机械加工-机械加工-精密机械加工-上海欧野精工机械有限公司 上海慧泰仪器制造有限公司_一体型马弗炉-可控真空干燥箱-强光稳定性试验箱 | 久久91精品久久91综合_国产亚洲自拍一区_国产精品第1页_亚洲高清视频一区_91成人午夜在线精品_亚洲国产精品网站在线播放_亚洲国产成人久久综合区_国产精品亚洲专区在线观看_免费视频精品一区二区三区 | 企业信息安全整体解决方案提供商-上海华垸信息技术有限公司 | 燃气锅炉-供暖锅炉-热水锅炉-电锅炉-北京锅炉安装公司-北京亦辰科技有限公司 | 氢能展,氢能展会,燃料电池展,加氢设备_氢气储运_制氢设备_氢燃料汽车_加氢站成套设备 | 上海钧尚电器有限公司 - Faulhaber电机 AMETEK pittman电机 AMETEK ROTRON军用航空风机 Exlar电动缸 MAE电机 MCG电机 CP电动工具 马头工具 AMCI驱动器 直流电机 减速箱 直流伺服电机,无刷电机,直线电机 直流防爆电机 防爆电机 汽车助力转向电机 EPS电机 faulhaber motor faulhaber gearbox NANOTEC电机 ELWOOD电机 PHYTRON电机 EXLAR伺服电动缸 高力矩、高性能直流电机,音圈电机,风机,直流风机,航空风机 | 精品中文字幕在线观看,粉嫩av一区二区三区,最近中文字幕在线看免费视频,亚洲高清在线观看,日本一区二区视频手机免费看,国产黄色小视频,亚洲高清免费视频,国产精品一区二区欧美视频,亚洲人免费视频,亚洲视频在线观看免费,国产免费高清综合视频,中文字幕永久在线 | 陕西硅酸钙板厂家_西安水泥压力板-陕西凯盛达建材科技有限公司 | 维启科技-创造科技的无限可能 | 上海维启信息技术有限公司 建筑仿真 BIM 虚拟现实 VR AR 顶岗实习 建筑智能模型 | 威海实木家具-威海定制家具-威海家具-威海至佳百隆家具有限公司 威海木箱,威海木托盘,威海免熏蒸包装箱-威海耀晟木制品有限公司 | 孝感东方妇科医院_孝感妇科医院哪家好_孝感人流多少钱 | 氯化氢钢瓶回收_氯化氢气体钢瓶回收_山东言赫化工有限公司 | 推荐|广佛一条龙高端茶到底有多香| 亚克力游泳池_透明/空中/无边泳池_别墅亚克力泳池设计生产厂家_瑞地格乐-深圳他拍档 | 青田人才网_青田招聘网_求职找工作平台 | 深圳办公室装修_设计_实景_效果图_哪家好-公装装饰公司 | 中山电子控制板|中山工业控制板|中山市云禾电子科技有限公司 | 山东荣利中石油机械有限公司 | 天津止回阀-止回阀报价/哪家好-天津蝶阀/进口阀门/通风蝶阀批发-闸阀阀门/球阀生产厂家-天津凯维斯阀门制造 | 上海先顶仪器设备有限公司-国产氮气发生器-进口氮气发生器 | 中科迈金节能技术(浙江)有限公司 | 实木运动地板价格_运动木地板厂家-欧氏实木运动地板网 | 铜排,异型紫棒,紫铜棒,紫铜微孔管,异型黄管,黄铜管,异形紫管,紫铜管,焊接铜管,散热器铜管,电力铜管_河间市通海铜业有限公司 | 密集架,密集柜,智能密集架,档案密集架,智慧档案馆(室)一体化建设 | 气体灭火安装,气体灭火系统安装,七氟丙烷灭火系统安装,消防气体灭火控制系统 |