目錄
1. 什麼是日誌記錄
2. ThinkPHP6 非同步日誌記錄
3. 總結
首頁 php框架 ThinkPHP 如何使用ThinkPHP6進行非同步日誌記錄操作?

如何使用ThinkPHP6進行非同步日誌記錄操作?

Jun 12, 2023 am 09:57 AM
thinkphp 非同步 日誌記錄

隨著互聯網的高速發展,日誌記錄服務成為了每個大型 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 框架進行非同步日誌記錄操作,使日誌記錄不再影響應用程式的回應速度。整體來說,以下是操作步驟:

  1. 開發自己的非同步日誌記錄器
  2. #使用RabbitMQ 進行訊息佇列處理
  3. 編寫訊息處理程序

在實際專案中,我們需要根據具體的需求來最佳化程式碼和調整佇列的配置。透過非同步記錄日誌,可以有效提高 web 應用的運作效率,並提高系統的穩定性與可靠性。

以上是如何使用ThinkPHP6進行非同步日誌記錄操作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

thinkphp專案怎麼運行 thinkphp專案怎麼運行 Apr 09, 2024 pm 05:33 PM

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

thinkphp有幾個版本 thinkphp有幾個版本 Apr 09, 2024 pm 06:09 PM

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

thinkphp怎麼運行 thinkphp怎麼運行 Apr 09, 2024 pm 05:39 PM

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

laravel和thinkphp哪個好 laravel和thinkphp哪個好 Apr 09, 2024 pm 03:18 PM

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

thinkphp怎麼安裝 thinkphp怎麼安裝 Apr 09, 2024 pm 05:42 PM

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

thinkphp效能怎麼樣 thinkphp效能怎麼樣 Apr 09, 2024 pm 05:24 PM

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

如何為 PHP 網站建立自訂日誌記錄解決方案 如何為 PHP 網站建立自訂日誌記錄解決方案 May 03, 2024 am 08:48 AM

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

Python asyncio 進階指南:從初學者到專家 Python asyncio 進階指南:從初學者到專家 Mar 04, 2024 am 09:43 AM

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

See all articles