目次
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;
        }
    }
}
ログイン後にコピー

上記のコードは、キュー接続のホスト、ポートなどを定義します。$client->channel() を通じてチャネル オブジェクトが作成され、チャネル オブジェクトが作成されます。 $channel->exchangeDeclare() および $channel->queueDeclare() を通じて Exchange とキューを作成し、それらをバインドします。最後に、$channel->consume() を使用して、キューからメッセージを非同期に消費し、メッセージ処理クラスにメッセージを送信します。

3. 概要

この記事では、ThinkPHP6 フレームワークを使用して非同期ログ操作を実行し、ログがアプリケーションの応答速度に影響を与えないようにする方法を紹介します。一般に、手順は次のとおりです。

  1. 独自の非同期ロガーを開発する
  2. メッセージ キュー処理に RabbitMQ を使用する
  3. メッセージ ハンドラーを作成する

実際のプロジェクトでは、特定のニーズに応じてコードを最適化し、キュー構成を調整する必要があります。非同期ロギングにより、Web アプリケーションの動作効率が効果的に向上し、システムの安定性と信頼性が向上します。

以上が非同期ログ操作に ThinkPHP6 を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

thinkphpプロジェクトの実行方法 thinkphpプロジェクトの実行方法 Apr 09, 2024 pm 05:33 PM

ThinkPHP プロジェクトを実行するには、Composer をインストールし、Composer を使用してプロジェクトを作成し、プロジェクト ディレクトリに入り、php bin/consoleserve を実行し、http://localhost:8000 にアクセスしてようこそページを表示する必要があります。

thinkphp にはいくつかのバージョンがあります thinkphp にはいくつかのバージョンがあります Apr 09, 2024 pm 06:09 PM

ThinkPHP には、さまざまな PHP バージョン向けに設計された複数のバージョンがあります。メジャー バージョンには 3.2、5.0、5.1、および 6.0 が含まれますが、マイナー バージョンはバグを修正し、新機能を提供するために使用されます。最新の安定バージョンは ThinkPHP 6.0.16 です。バージョンを選択するときは、PHP バージョン、機能要件、コミュニティ サポートを考慮してください。最高のパフォーマンスとサポートを得るには、最新の安定バージョンを使用することをお勧めします。

thinkphpの実行方法 thinkphpの実行方法 Apr 09, 2024 pm 05:39 PM

ThinkPHP フレームワークをローカルで実行する手順: ThinkPHP フレームワークをローカル ディレクトリにダウンロードして解凍します。 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 フレームワークです。公式パフォーマンステストでは、1秒あたり10,000以上のリクエストを処理できることが示されており、実際のアプリケーションではJD.comやCtripなどの大規模なWebサイトやエンタープライズシステムで広く使用されています。

PHP Web サイト用のカスタム ログ ソリューションを作成する方法 PHP Web サイト用のカスタム ログ ソリューションを作成する方法 May 03, 2024 am 08:48 AM

PHP Web サイト用のカスタム ログ ソリューションを作成するには、PSR-3 互換ライブラリ (Monolog、Log4php、PSR-3Logger など) を使用する方法、または PHP ネイティブ ログ関数 (error_log()、syslog( など) を使用する方法など、いくつかの方法があります。 )、debug_print_backtrace())。アプリケーションの動作の監視と問題のトラブルシューティングは、カスタム ログ ソリューションを使用して簡単に行うことができます。たとえば、Monolog を使用して、メッセージをディスク ファイルに記録するロガーを作成します。

C++ クラス設計でエラー処理とログ記録を実行するにはどうすればよいですか? C++ クラス設計でエラー処理とログ記録を実行するにはどうすればよいですか? Jun 02, 2024 am 09:45 AM

C++ クラス設計におけるエラー処理とログ記録には、次のものが含まれます。 例外処理: カスタム例外クラスを使用して例外をキャッチして処理し、特定のエラー情報を提供します。エラー コード: 整数または列挙を使用してエラー状態を表し、戻り値で返します。アサーション: 事前条件と事後条件を確認し、条件が満たされない場合は例外をスローします。 C++ ライブラリのロギング: std::cerr および std::clog を使用した基本的なロギング。外部ログ ライブラリ: レベル フィルタリングやログ ファイル ローテーションなどの高度な機能を提供するサードパーティ ライブラリを統合します。カスタム ログ クラス: 独自のログ クラスを作成し、基礎となるメカニズムを抽象化し、さまざまなレベルの情報を記録するための共通インターフェイスを提供します。

See all articles