隨著互聯網的高速發展,日誌記錄服務成為了每個大型 web 應用必不可少的模組。為了方便錯誤排查、效能監控等各種需求,本文將介紹如何使用 ThinkPHP6 框架進行非同步日誌記錄操作。
1. 什麼是日誌記錄
在電腦科學領域,日誌記錄是指將電腦系統中發生的事件和資訊記錄下來。通常,這些記錄都以文件或資料庫的形式儲存。日誌記錄有助於了解系統運作狀況,及時發現和解決問題,進而提高系統的可靠性和穩定性。
在 web 應用中,日誌記錄可以幫助開發者更了解系統的遇到的問題和錯誤。依據日誌記錄,開發者可以清楚了解應用程式的行為以及錯誤發生的位置和時機。
2. ThinkPHP6 非同步日誌記錄
在應用程式開發過程中,日誌記錄是一個不可或缺的模組。而且,日誌記錄經常是一個耗時的操作,如果同步執行的話會影響系統的效能。為此,ThinkPHP6 引入了非同步日誌記錄的功能,讓日誌記錄不再影響應用的反應速度。
通常在控制器或模型中記錄日誌,我們使用注入 PsrLogLoggerInterface
介面來實作。
// Controller或Model中 use PsrLogLoggerInterface; public function index(LoggerInterface $logger){ $logger->info('hello world'); }
簡單的使用方式。使用非同步日誌記錄,定義一個非同步日誌記錄器:
use MonologLogger; use MonologHandlerStreamHandler; $logger=new Logger("AsyncLogger"); $logger->pushHandler(new StreamHandler('runtime/log/async.log'), Logger::INFO);
日誌記錄器定義好後,使用佇列傳送日誌記錄訊息,這裡我們選擇使用 RabbitMQ 當做佇列服務。
// Message类 namespace appcommon; class Message { /** * 记录日志 * @param $level * @param $message * @param array $context * @return bool */ public static function log($level,$message,array $context=[]){ $data=[ 'level'=>$level, 'message'=>$message, 'context'=>$context, 'channel'=>'AsyncLogger', 'datetime'=>date('Y-m-d H:i:s'), 'host'=>$_SERVER['SERVER_ADDR'] ?? '', 'uri'=>$_SERVER['REQUEST_URI'] ?? '', ]; $producer=Queue::getConnection('AsyncLogger',true); $producer->setExchangeOptions(['name'=>'async_logs','type'=>'topic','durable'=>true])->declareExchange(); try{ $producer->publish(json_encode($data),[ 'routing_key' =>'log', 'exchange' =>'async_logs', ]); return true; }catch (Exception $e){ return false; } } }
其中,我們使用appcommonQueue
類別來提供rabbitmq 的連接實例;data
中除了記錄日誌的資訊外,還包含一些環境信息,例如時間、 IP位址、請求的uri位址等。
佇列處理程序:
// Consumer类 use BunnyMessage; use PsrLogLoggerInterface; class Consumer { /** * @param Message $message * @param LoggerInterface $logger */ public function process(Message $message,LoggerInterface $logger){ $body=$message->content; $data= json_decode($body,true); $channel=$data['channel'] ?? 'default_logger'; $logger->notice($data['message'], $data); } }
當然,我們還需要一個輔助處理日誌的類別。
// Queue类 namespace appcommon; use BunnyAsyncClient; use BunnyChannel; use BunnyMessage; use BunnyProtocolMethodBasicConsumeOkFrame; use BunnyProtocolMethodChannelCloseFrame; use BunnyProtocolMethodChannelCloseOkFrame; use BunnyProtocolMethodConnectionCloseFrame; use BunnyProtocolMethodConnectionCloseOkFrame; use BunnyProtocolMethodConnectionStartFrame; use BunnyClientStateEnum; use BunnyMessage as BunnyMessage; class Queue { /** * @param string $queueName * @return Client|null */ public static function getConnection(string $routingKey, bool $persistent=false):?Client { $config=config('rabbitmq.async_log'); $client=new Client([ 'host' => $config['host'], 'port' => $config['port'], 'user' => $config['user'], 'password' => $config['password'], 'vhost' => $config['vhost'],//注意此处改为需要的 VHOST 'concurrency' => 2, ]); try{ $client->connect(); $client->channel() ->then(function (Channel $channel) use($client,$routingKey,$persistent){ $channel->exchangeDeclare('async_logs','topic',true,true); $channel->queueDeclare($routingKey, $passive=false,$durable=true,$exclusive=false,$autoDelete=false,$nowait=false); $channel->queueBind($routingKey, 'async_logs', $routingKey); $channel->consume( function ($msg, Channel $channel, BunnyMessage $message) use($client,$routingKey){ $className=config('rabbitmq.async_log.consumer'); $consumer=new $className($client,$routingKey); $consumer->process($message,app('log.async_logger')); $channel->ack($msg);//处理消息 }, $routingKey,//队列Name '',//消费Tag false,//no_local false,//no_ack false,//exclusive $persistent ? ['delivery_mode'=>2] : [] ); }); }catch (Exception $e){ return null; }finally{ return $client; } } }
上面這段程式碼中定義了佇列連接的host、port 等,透過$client->channel()
建立了一個channel 對象,透過$channel- >exchangeDeclare()
和$channel->queueDeclare()
建立了exchange 和queue,並將它們進行了綁定。最後,使用 $channel->consume()
非同步消費佇列的訊息,並將訊息傳送到訊息處理類別中。
3. 總結
本文介紹如何使用 ThinkPHP6 框架進行非同步日誌記錄操作,使日誌記錄不再影響應用程式的回應速度。整體來說,以下是操作步驟:
- 開發自己的非同步日誌記錄器
- #使用RabbitMQ 進行訊息佇列處理
- 編寫訊息處理程序
在實際專案中,我們需要根據具體的需求來最佳化程式碼和調整佇列的配置。透過非同步記錄日誌,可以有效提高 web 應用的運作效率,並提高系統的穩定性與可靠性。
以上是如何使用ThinkPHP6進行非同步日誌記錄操作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文討論了ThinkPHP的內置測試框架,突出了其關鍵功能(例如單元和集成測試),以及它如何通過早期的錯誤檢測和改進的代碼質量來增強應用程序可靠性。

本文討論了在無服務器體系結構中使用ThinkPHP的關鍵注意事項,專注於性能優化,無狀態設計和安全性。它突出了諸如成本效率和可擴展性之類的收益,但也應對挑戰

本文討論了在ThinkPHP微服務中實施服務發現和負載平衡,重點是設置,最佳實踐,集成方法和推薦工具。[159個字符]

ThinkPHP的IOC容器提供了高級功能,例如懶惰加載,上下文綁定和方法注入PHP App中有效依賴性管理的方法。Character計數:159

ThinkPHP具有輕巧的設計,MVC架構和可擴展性。它通過各種功能提高可擴展性,加快開發並提高安全性。

本文概述了使用ThinkPhp和RabbitMQ構建分佈式任務隊列系統,重點是安裝,配置,任務管理和可擴展性。關鍵問題包括確保高可用性,避免常見的陷阱,例如不當


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中