如何使用ThinkPHP6進行非同步日誌記錄操作?
隨著互聯網的高速發展,日誌記錄服務成為了每個大型 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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

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

Dreamweaver CS6
視覺化網頁開發工具

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

執行 ThinkPHP 專案需要:安裝 Composer;使用 Composer 建立專案;進入專案目錄,執行 php bin/console serve;造訪 http://localhost:8000 查看歡迎頁面。

ThinkPHP 擁有多個版本,針對不同 PHP 版本而設計。主要版本包括 3.2、5.0、5.1 和 6.0,而次要版本用於修復 bug 和提供新功能。目前最新穩定版本為 ThinkPHP 6.0.16。在選擇版本時,需考慮 PHP 版本、功能需求和社群支援。建議使用最新穩定版本以獲得最佳性能和支援。

ThinkPHP Framework 的本機運作步驟:下載並解壓縮 ThinkPHP Framework 到本機目錄。建立虛擬主機(可選),指向 ThinkPHP 根目錄。配置資料庫連線參數。啟動 Web 伺服器。初始化 ThinkPHP 應用程式。存取 ThinkPHP 應用程式 URL 運行。

Laravel 和 ThinkPHP 框架的效能比較:ThinkPHP 效能通常優於 Laravel,專注於最佳化和快取。 Laravel 性能良好,但對於複雜應用程序,ThinkPHP 可能更適合。

ThinkPHP 安裝步驟:準備 PHP、Composer、MySQL 環境。使用 Composer 建立專案。安裝 ThinkPHP 框架及相依性。配置資料庫連線。產生應用程式碼。啟動應用程式並造訪 http://localhost:8000。

ThinkPHP 是一款高效能的 PHP 框架,具備快取機制、程式碼最佳化、平行處理和資料庫最佳化等優勢。官方性能測試顯示,它每秒可處理超過 10,000 個請求,實際應用中被廣泛用於京東商城、攜程網等大型網站和企業系統。

可以透過多種方式為PHP網站建立自訂日誌記錄解決方案,包括:使用PSR-3相容的程式庫(如Monolog、Log4php、PSR-3Logger)或使用PHP本機日誌函數(如error_log()、syslog( )、debug_print_backtrace())。使用自訂日誌記錄解決方案可以輕鬆監視應用程式的行為並解決問題,例如:使用Monolog建立將訊息記錄到磁碟檔案的日誌記錄器。

並發和非同步編程並發編程處理同時執行的多個任務,非同步編程是一種並發編程,其中任務不會阻塞線程。 asyncio是python中用於非同步程式設計的函式庫,它允許程式在不阻塞主執行緒的情況下執行I/O操作。事件循環asyncio的核心是事件循環,它監控I/O事件並調度相應的任務。當一個協程準備好時,事件循環會執行它,直到它等待I/O操作。然後,它會暫停協程並繼續執行其他協程。協程協程是可暫停和恢復執行的函數。 asyncdef關鍵字用於建立協程。協程使用await關鍵字等待I/O作業完成。 asyncio的基礎以下
