> PHP 프레임워크 > ThinkPHP > 비동기 로깅 작업에 ThinkPHP6을 사용하는 방법은 무엇입니까?

비동기 로깅 작업에 ThinkPHP6을 사용하는 방법은 무엇입니까?

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
풀어 주다: 2023-06-12 09:57:11
원래의
2393명이 탐색했습니다.

인터넷의 급속한 발전과 함께 로깅 서비스는 모든 대규모 웹 애플리케이션의 필수 모듈이 되었습니다. 오류 문제 해결 및 성능 모니터링과 같은 다양한 요구 사항을 용이하게 하기 위해 이 기사에서는 ThinkPHP6 프레임워크를 사용하여 비동기 로깅 작업을 수행하는 방법을 소개합니다.

1. 로깅이란

컴퓨터 과학 분야에서 로깅은 컴퓨터 시스템에서 발생하는 이벤트 및 정보를 기록하는 것을 의미합니다. 일반적으로 이러한 레코드는 파일이나 데이터베이스에 저장됩니다. 로깅은 시스템의 운영 상태를 파악하고 적시에 문제를 발견 및 해결함으로써 시스템의 신뢰성과 안정성을 향상시키는 데 도움이 됩니다.

웹 애플리케이션에서 로깅은 개발자가 시스템에서 발생하는 문제와 오류를 더 잘 이해하는 데 도움이 될 수 있습니다. 로깅을 기반으로 개발자는 애플리케이션의 동작과 오류가 발생한 위치와 시기를 명확하게 이해할 수 있습니다.

2. ThinkPHP6 비동기 로깅

애플리케이션 개발 과정에서 로깅은 필수 모듈입니다. 더욱이, 로깅은 동기적으로 수행될 경우 시스템 성능에 영향을 줄 수 있는 시간 소모적인 작업인 경우가 많습니다. 이를 위해 ThinkPHP6에서는 비동기 로깅 기능을 도입하여 로깅이 더 이상 애플리케이션의 응답 속도에 영향을 미치지 않도록 합니다.

일반적으로 컨트롤러나 모델에 로그인할 때 주입된 PsrLogLoggerInterface 인터페이스를 사용하여 이를 달성합니다. PsrLogLoggerInterface 接口来实现。

1

2

3

4

5

6

// Controller或Model中

use PsrLogLoggerInterface;

 

public function index(LoggerInterface $logger){

    $logger->info('hello world');

}

로그인 후 복사

简单的使用方式。使用异步日志记录,定义一个异步日志记录器:

1

2

3

4

5

use MonologLogger;

use MonologHandlerStreamHandler;

 

$logger=new Logger("AsyncLogger");

$logger->pushHandler(new StreamHandler('runtime/log/async.log'), Logger::INFO);

로그인 후 복사

日志记录器定义好后,使用队列发送日志记录信息,这里我们选择使用 RabbitMQ 当做队列服务。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

// 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地址等。

队列处理程序:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

// 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);

    }

}

로그인 후 복사

当然,我们还需要一个辅助处理日志的类。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

// 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()rrreee

사용하기 쉽습니다. 비동기 로깅을 사용하여 비동기 로거 정의:

rrreee

로거가 정의된 후 대기열을 사용하여 로깅 정보를 보냅니다. 여기서는 RabbitMQ를 대기열 서비스로 사용하도록 선택합니다.

rrreee

그 중 appcommonQueue 클래스를 사용하여 로그 정보 기록 외에도 data에는 시간 및 IP와 같은 일부 환경 정보가 포함되어 있습니다. 주소, 요청된 URI 주소 등
  1. 큐 핸들러:
  2. rrreee
  3. 물론 로그 처리를 지원하는 클래스도 필요합니다.
  4. rrreee
  5. 위 코드는 큐 연결의 호스트, 포트 등을 정의하고 있으며, $client->channel()을 통해 채널 개체가 생성되고, 를 통해 채널 개체가 생성됩니다. >$channel->exchangeDeclare ()$channel->queueDeclare()는 exchange와 queue를 생성하고 바인딩합니다. 마지막으로 $channel->consume()을 사용하여 대기열의 메시지를 비동기적으로 소비하고 해당 메시지를 메시지 처리 클래스로 보냅니다.
3. 요약

이 글에서는 로깅이 더 이상 애플리케이션의 응답 속도에 영향을 미치지 않도록 ThinkPHP6 프레임워크를 사용하여 비동기 로깅 작업을 수행하는 방법을 소개합니다. 일반적으로 다음 단계는 다음과 같습니다. 🎜🎜🎜자신만의 비동기 로거 개발 🎜🎜메시지 대기열 처리에 RabbitMQ 사용 🎜🎜메시지 핸들러 작성 🎜🎜🎜실제 프로젝트에서는 특정 요구 사항에 따라 코드를 최적화하고 조정해야 합니다. 대기열의 구성. 비동기 로깅을 통해 웹 애플리케이션의 운영 효율성을 효과적으로 향상시킬 수 있으며 시스템의 안정성과 신뢰성을 향상시킬 수 있습니다. 🎜

위 내용은 비동기 로깅 작업에 ThinkPHP6을 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿