怎样使用ThinkPHP6举行异步日志纪录操作?
随着互联网的高速生长,日志纪录效劳成为了每个大型 web 应用必不可少的?。为了利便过失排查、性能监控等种种需求,本文将先容怎样使用 thinkphp6 框架举行异步日志纪录操作。
1. 什么是日志纪录
在盘算机科学领域,日志纪录是指将盘算机系统中爆发的事务和信息纪录下来。通常,这些纪录都以文件或数据库的形式存储。日志纪录有助于相识系统运行状态,实时发明息争决问题,进而提高系统的可靠性和稳固性。
在 web 应用中,日志纪录可以资助开发者更好地相识系统的遇到的问题和过失。依据日志纪录,开发者可以清晰地相识应用的行为以及过失爆发的位置和时机。
2. ThinkPHP6 异步日志纪录
在应用开发历程中,日志纪录是一个必不可少的?。并且,日志纪录经常是一个耗时的操作,若是同步执行的话会影响系统的性能。为此,ThinkPHP6 引入了异步日志纪录的功效,让日志纪录不再影响应用的响应速率。
通常在控制器或模子中纪录日志,我们使用注入 PsrLogLoggerInterface 接口来实现。
连忙学习“PHP免费学习条记(深入)”;
// 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举行异步日志纪录操作?的详细内容,更多请关注本网内其它相关文章!