动态

列表
创建 时间

thinkphp中行鎖(Lock)操作跟事務的關係以及用法

事務跟行鎖(Lock)的關係 首先解釋下事務和鎖各自的作用 事務的作用 事務主要保證一組數據庫操作(增刪改)的原子性, 即要麼全部執行成功,要麼全部失敗,避免出現數據不一致的中間狀態. 加鎖的作用 加鎖主要解決併發場景下的數據競爭問題, 比如多個請求同時修改同一條數據時,可能導致"髒讀""不可重複讀"等問題. 如果僅僅使用事務不用鎖的侷限性 事務操作雖然

创建 时间

thinkphp5.0項目配置多MySQL數據庫連接

公司項目需要連接2個MySQL數據庫 背景介紹: 公司項目是基於fastadmin 1.4.0.20230711 開發的,裏面用到的thinkphp版本是5.0.25,項目涉及到小程序端和設備端,之前做的是兩個項目,但是部署在同一台服務器上,分別對應兩個數據庫,之前兩個項目之間的交互是通過互相調用對方接口的方式實現的,優化的時候就想通過在一個項目中連接兩個MySQL數據庫的方式,避免互相調用帶來的

创建 时间

PHP項目中引入並monolog進行日誌管理

在 ThinkPHP(以 5.x 為例)中引入並使用 Monolog(一款功能強大的 PHP 日誌庫),可以實現更靈活的日誌處理(如多渠道輸出、按級別拆分、格式化等)。以下是具體步驟: 一、安裝 Monolog 通過 Composer 安裝 Monolog 依賴: composer require monolog/monolog 二、封裝 Monolog 工具類 為了在 ThinkPHP 中方便

创建 时间

Thinkphp與Hook(鈎子)

在 ThinkPHP 中,Hook(鈎子)是實現插件機制和行為擴展的核心機制,它允許開發者在不修改框架的核心代碼的情況下, 通過監聽特定事件標籤的方式實現在框架或應用的特定執行節點插入自定義邏輯,從而實現了 "面向切面編程"(AOP)的思想。 Hook的基本概念 Hook是一種事件驅動的編程模式,允許在特定的執行點觸發自定義行為。ThinkPHP中的Hook機制基於行為擴展,可以在系統運行過程中動

创建 时间

post請求form-data與json格式的body體對比

接口文檔如下所示: POST請求body傳遞form-data類型數據 得到的結果如下沒有得到想要的數據: 查看實際請求的Header結果如下 Content-type類型是multipart/form-data類型 : 對應body中的內容如下: POST請求body傳遞json類型數據 使用Apipost模擬請求如下: 這

创建 时间

通用curl發送請求方法

最近在對三方接口需要經常用curl發送請求, 特別是post請求的時候要求各自格式的body,下面總結了一個curl請求模板 public static function curlRequest($url, array $paramsArr, $method = 'post', $contentType = 'urlencoded', $header = []) { $pa

创建 时间

websocket藉助redis實現日誌保存

背景介紹 舊項目是藉助swoole並通過'php websocketServer.php' 啓動websocket服務的, 設備端想通過websocket推送一些數據給服務器, 服務器將相應的數據單獨保存起來方便設備那邊後期查看. 由於採用的websocket服務的啓動方式導致不能直接使用thinkphp提供的很多方法,我就想借助reids, 當websocket收到設備推送的數據後先存到redi

创建 时间

項目實戰用swoole啓websocket服務

項目中用到了websocket長鏈接, 記錄下結合swoole如何實現這個功能 項目中之所以要用websocket主要是想實現用户在回收設備上掃碼投遞瓶子之後,將投遞的瓶子數據推送到用户小程序端進行同步展示, 這樣用户在設備上投遞完瓶子後, 在小程序上就能同時看到相應變化, 給用户一個更好的使用體驗 面向過程風格代碼 //引入redis $redis = new \Redis(); $redis-

创建 时间

使用swoole部署websocket服務端

使用swoole部署websocket服務端 Swoole 支持在同一個 WebSocket 服務中監聽多個端口,併為不同端口配置不同的協議(ws 或 wss)。只需在創建 Swoole\WebSocket\Server 時通過 addListener() 方法添加額外端口,並分別配置 SSL 證書即可。 方式一:直接起兩個服務端口(不推薦) 方式一實現示例代碼: ?php // 創建主服務器(默

创建 时间

fastadmin後台表格操作中增加自定義按鈕彈窗

fastadmin後台訂單列表增加按鈕彈窗 項目後台訂單列表中需要增加個"發貨按鈕",實現點擊打開彈框選擇快遞公司和輸入單號後提交後台. 最終實現的效果如下所示: 點擊發貨按鈕效果如下: 具體的代碼實現邏輯如下所示: order.js中增加發貨按鈕 { field: 'buttons', title: '按鈕組', width:"120px", table: t

创建 时间

Thinkphp中關聯預載入(Eager Loading)的核心實現邏輯

thinkphp中我們常通過使用關聯預載入(Eager Loading)來解決關聯查詢中"N+1 查詢問題", 通過減少數據庫查詢次數來提升性能. 其底層實現邏輯可以分為以下幾個關鍵步驟: 1.關聯定義的基礎 以下面的代理為例子: //$this-model = new \app\admin\model\device\Relation; $list = $this-model -wher

创建 时间

mqtt在php項目中的常見用法

MQTT協議在thinkphp項目中的常見用法 一般我們在實際項目中用,都是將相關方法寫到自定義指令控制器中, 後期通過supervisor進程管理工具啓一個進程專門運行自定義指令, 來實現持續監聽處理的邏輯 composer三方擴展用的是 'php-mqtt/client' 帶重連的標準寫法如下所示: while (true) { try { //獲取長連接客户端(單例,

创建 时间

think-queue隊列擴展實戰

topthink/think-queue 是 ThinkPHP 框架的官方隊列擴展,用於處理異步任務(如訂單通知、郵件發送、數據同步等),避免因耗時操作阻塞主流程。以下是其常見用法和核心功能説明: 一. 安裝與配置 安裝擴展 composer require topthink/think-queue 配置隊列驅動 在 config/queue.php 中配置

创建 时间

處理一個Redis數據庫切換邏輯缺陷導致的問題

問題背景 最近在做瓶體回收設備改成沒有顯示大屏, 設備與服務器通過MQTT協議進行通信的方式, 服務器後台訂閲了所有設備的發佈頻道"device/+/publish", 這樣後台就能收到給所有設備發佈的消息, 進而進行邏輯處理. 問題表現 小程序用户掃碼設備上的二維碼與設備綁定後, 後台會更新redis中對應設備的緩存信息設置is_bind=1,uid=綁定用户id, 標記當前設備已經與某個用户綁

创建 时间

結合生活中的場景來理解棧內存跟堆內存的區別

在程序開發中經常遇到值類型的數據跟引用類型的數據, 值類型的數據存儲在棧內存中, 引用類型的數據實例存儲在堆內存中, 變量保存的時候對象在堆內存中的引用地址. 棧內存跟堆內存兩者有啥區別哪? 我們可以用生活中常見的"快遞收發"場景來對比兩者的區別. 先建立一個核心比喻:內存 = 快遞站點 把整個計算機內存想象成一個 “快遞站點”,站點裏有兩種存放快遞的區域: 棧內存 = 站點前台的

创建 时间

記錄一次系統被DDOS攻擊的處理過程

問題情況 公司項目在9.26號的時候被攻擊了, 正常情況下一天的提現金額是一百多,但是26號一天提現彙總金額到2700多,是平時的幾十倍, 明顯是受到惡意網絡攻擊了: 問題1: 被攻擊那幾天每日產生的星能異常的高 正常一天系統就產生1萬多的星能, 26號一天產生了416萬多的星能, 是平日的幾百倍 從上圖可以看出26號,27號產生了大量異常的星能 問題2: 後來查詢發現一個ip一天簽到了6

创建 时间

不借助三方擴展對接微信支付分相關V3接口

背景介紹 之前對接微信支付V3接口的時候都是要藉助一些三方擴展來實現, 最近項目中需要用到微信支付分相關的api接口,一般的擴展中沒有這塊兒的功能, 通過自定義方法實現微信支付分相關的V3api接口對接 調用v3接口以及解密回調工具類 namespace fast; use think\Log; class WechatUtil { //獲取微信支付配置的參數信息 pub

创建 时间

php中閉包函數在實際項目的一次妙用

php中閉包函數(Closure) 的基本語法如下: 使用 function 關鍵字定義, 但不寫函數名: $closure = function ($name) { return "Hello, $name!"; }; echo $closure("World"); // 輸出: Hello, World! 之前只是知道有這麼個東西, 但是在實際項目中一直沒有用過. 實際場景 這次在

创建 时间

Fastadmin工具欄btn-multi多選操作按鈕設置

後台渲染工具欄按鈕的時候, 如何自定義多選操作? 在用Fastadmin進行後台管理的時候,有時候需要用到多選操作 index.html中增加多選按鈕 div class="dropdown btn-group {:$auth-check('device/lists/multi')?'':'hide'}" a class="btn btn-primary btn-more dropdo

创建 时间

Fastadmin通過模型初始化事件解決實際項目問題

thinkphp5.0中的模型初始化事件 在Thinkphp5.0中, 模型初始化事件(Model Initialization Events)是模型生命週期中的關鍵機制,用於在模型實例化、數據操作(新增、更新、刪除等)的特定階段觸發自定義邏輯,實現數據校驗、字段處理、日誌記錄等功能。這些事件通過 “鈎子” 方式嵌入模型的核心流程,無需修改框架源碼即可擴展功能。 1. 模型初始化事件的基本概念 模

创建 时间

Fastadmin後台列表中給某列加一個彈窗展示

效果 用Fastadmin做管理後台的時候,有時候需要在後台列表中某列數據加一個明細彈窗, 點擊該列數據後在彈窗中展示關聯明細信息, 效果如下圖所示: 設備分組列表中,想在彈窗中展示對應分組關聯的設備列表 點擊關聯設備列表出現下面的彈窗 實現上面效果的代碼 1. 設備分組group.js中做如下修改 //打開device/group/index頁面的時候fastaadmin