Skip to content

Commit a78879a

Browse files
陈家文陈家文
陈家文
authored and
陈家文
committed
mr.wen 添加subject的异常处理
1 parent b45784c commit a78879a

File tree

2 files changed

+63
-26
lines changed

2 files changed

+63
-26
lines changed

Src/AsyncLogHandle/AsyncLogSubject.php

+57-26
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,34 @@ class AsyncLogSubject
1414
* 存储观察者
1515
* @var array
1616
*/
17-
private $_observers = array();
17+
private $observers = array();
1818

1919
/**
2020
* 日志格式
2121
* @var string
2222
*/
23-
protected $_log_path;
23+
protected $log_path;
2424

2525
/**
2626
* 日志处理信息
2727
* @var array
2828
*/
2929
protected $log_deal;
3030

31+
/**
32+
* 出现异常的回调函数
33+
* @var callback
34+
*/
35+
protected $exception_callback = null;
36+
3137
/**
3238
* AsyncLogSubject constructor.
3339
* @param string $time
3440
*/
3541
public function __construct($time = 'today')
3642
{
3743
// 1. 设置日志路径
38-
$this->_getLogPath($time);
44+
$this->getLogPath($time);
3945

4046
// 2. 设置日志处理 变量的数据格式
4147
$this->log_deal = [
@@ -58,7 +64,7 @@ public function __construct($time = 'today')
5864
*/
5965
public function addObserver(AsyncLogObserver $observer)
6066
{
61-
$this->_observers[] = $observer;
67+
$this->observers[] = $observer;
6268
}
6369

6470
/**
@@ -68,29 +74,30 @@ public function addObserver(AsyncLogObserver $observer)
6874
public function handle()
6975
{
7076
// 1. 验证文件是否存在
71-
if (!file_exists($this->_log_path)) {
72-
Log::warning('执行定时任务,读取日志文件来完成订阅与发布,找不到异步日志文件', ['文件名:' . $this->_log_path]);
77+
if (!file_exists($this->log_path)) {
78+
Log::warning('执行定时任务,读取日志文件来完成订阅与发布,找不到异步日志文件', ['文件名:' . $this->log_path]);
79+
$this->exception('执行定时任务,读取日志文件来完成订阅与发布,找不到异步日志文件,文件名:' . $this->log_path);
7380
exit;
7481
}
7582

7683
// 2. 读取日志文件
77-
$fp = fopen($this->_log_path, "r");
84+
$fp = fopen($this->log_path, "r");
7885
$lineNum = 1;
7986
while (!feof($fp)) {//循环读取,直至读取完整个文件
8087

8188
// 2.1 格式化数据结构
82-
$this->_handleBefore(fgets($fp, 1024 * 1024 * 1024), $lineNum++);
89+
$this->handleBefore(fgets($fp, 1024 * 1024 * 1024), $lineNum++);
8390
// 2.2 判断是否已经执行完毕
8491
if (empty($this->log_deal['deal_contain'])) {
85-
$this->_dealSuccessContain();
92+
$this->dealSuccessContain();
8693
Log::notice("执行定时任务,读取日志文件来完成订阅与发布,执行完毕!!!");
8794
break;
8895
}
89-
dump('执行定时任务,读取日志文件来完成订阅与发布,正在执行第'.$this->log_deal['deal_contain']['line_num'].'行...');
96+
dump('执行定时任务,读取日志文件来完成订阅与发布,正在执行第' . $this->log_deal['deal_contain']['line_num'] . '行...');
9097

9198
// 2.3 执行对应的message事物。
9299
$observerExists = $observerResult = null;
93-
foreach ($this->_observers as $key => $observer) {
100+
foreach ($this->observers as $key => $observer) {
94101
if (!empty($this->log_deal['deal_contain']['async_message']) && $this->log_deal['deal_contain']['async_message'] == $observer->message) {
95102
$observerResult = $observer->onHandle($this->log_deal['deal_contain']['async_context']);
96103
$observerExists = true;
@@ -99,35 +106,38 @@ public function handle()
99106

100107
if (empty($observerExists)) {
101108
// 2.4 如果不存在这个观察者
102-
$this->_dealSuccessContain();
109+
$this->dealSuccessContain();
103110
Log::warning(
104111
'执行定时任务,读取日志文件来完成订阅与发布,发现第' . $this->log_deal['deal_contain']['line_num'] . '行找不到与其对应的观察者',
105112
[
106113
'async的message:' . $this->log_deal['deal_contain']['async_message'],
107-
'日志路径为:'.$this->_log_path
114+
'日志路径为:' . $this->log_path
108115
]);
116+
$this->exception($this->log_deal['deal_contain']);
109117
} else if ($observerResult === null) {
110118
// 2.5 如果对应的观察者没有返回值
111-
$this->_dealSuccessContain();
119+
$this->dealSuccessContain();
112120
Log::warning(
113121
'执行定时任务,读取日志文件来完成订阅与发布,发现第' . $this->log_deal['deal_contain']['line_num'] . '行执行后没有返回值',
114122
[
115123
'async的message:' . $this->log_deal['deal_contain']['async_message'],
116-
'日志路径为:'.$this->_log_path
124+
'日志路径为:' . $this->log_path
117125
]);
126+
$this->exception($this->log_deal['deal_contain']);
118127
} else if ($observerResult === false) {
119128
// 2.6 执行失败
120-
$this->_dealSuccessContain();
129+
$this->dealSuccessContain();
121130
Log::error(
122131
'执行定时任务,读取日志文件来完成订阅与发布,发现第' . $this->log_deal['deal_contain']['line_num'] . '行执行失败',
123132
[
124133
'async的message:' . $this->log_deal['deal_contain']['async_message'],
125-
'日志路径为:'.$this->_log_path
134+
'日志路径为:' . $this->log_path
126135
]);
136+
$this->exception($this->log_deal['deal_contain']);
127137
} else if ($observerResult === true) {
128138
// 2.7 执行成功
129139
$this->log_deal['success_contain'] = [
130-
'start_line' => $this->log_deal['success_contain']['start_line']?:$this->log_deal['deal_contain']['line_num'],
140+
'start_line' => $this->log_deal['success_contain']['start_line'] ?: $this->log_deal['deal_contain']['line_num'],
131141
'end_line' => $this->log_deal['deal_contain']['line_num']
132142
];
133143
}
@@ -142,22 +152,43 @@ public function handle()
142152
*/
143153
public function removeObserver($observerName)
144154
{
145-
foreach ($this->_observers as $key => $observer) {
155+
foreach ($this->observers as $key => $observer) {
146156
if ($observer->getName() == $observerName) {
147-
array_splice($this->_observers, $key, 1);
157+
array_splice($this->observers, $key, 1);
148158
return true;
149159
}
150160
}
151161
return false;
152162
}
153163

164+
/**
165+
* 绑定异常监听函数
166+
* @param $callback
167+
* @Author jiaWen.chen
168+
*/
169+
public function onException($callback)
170+
{
171+
$this->exception_callback = $callback;
172+
}
173+
174+
/**
175+
* 调用异常处理
176+
* @param $message
177+
* @Author jiaWen.chen
178+
*/
179+
protected function exception($message)
180+
{
181+
if (!empty($this->exception_callback))
182+
($this->exception_callback)($message);
183+
}
184+
154185
/**
155186
* 格式化日志数据结构
156187
* @param $logStr
157188
* @param $lineNum
158189
* @Author jiaWen.chen
159190
*/
160-
protected function _handleBefore($logStr, $lineNum)
191+
protected function handleBefore($logStr, $lineNum)
161192
{
162193
// 1. 如果到最后一行,则清空deal_contain
163194
if ($logStr == false) {
@@ -185,13 +216,13 @@ protected function _handleBefore($logStr, $lineNum)
185216
* 对执行成功的日志进行合并输出
186217
* @Author jiaWen.chen
187218
*/
188-
protected function _dealSuccessContain()
219+
protected function dealSuccessContain()
189220
{
190221
if (!empty($this->log_deal['success_contain']['start_line']) && !empty($this->log_deal['success_contain']['end_line'])) {
191222
if ($this->log_deal['success_contain']['start_line'] == $this->log_deal['success_contain']['end_line']) {
192-
Log::notice("执行定时任务,读取日志文件来完成订阅与发布,第".$this->log_deal['success_contain']['start_line']."行执行成功");
223+
Log::notice("执行定时任务,读取日志文件来完成订阅与发布,第" . $this->log_deal['success_contain']['start_line'] . "行执行成功");
193224
} else {
194-
Log::notice("执行定时任务,读取日志文件来完成订阅与发布,第".$this->log_deal['success_contain']['start_line']."行至".$this->log_deal['success_contain']['end_line']."行执行成功");
225+
Log::notice("执行定时任务,读取日志文件来完成订阅与发布,第" . $this->log_deal['success_contain']['start_line'] . "行至" . $this->log_deal['success_contain']['end_line'] . "行执行成功");
195226
}
196227
}
197228
$this->log_deal['success_contain'] = [
@@ -205,9 +236,9 @@ protected function _dealSuccessContain()
205236
* @param string $time
206237
* @Author jiaWen.chen
207238
*/
208-
protected function _getLogPath($time = 'today')
239+
protected function getLogPath($time = 'today')
209240
{
210-
$this->_log_path = storage_path() . '/logs/async/async-' . date('Y-m-d', strtotime($time)) . '.log';
241+
$this->log_path = storage_path() . '/logs/async/async-' . date('Y-m-d', strtotime($time)) . '.log';
211242
}
212243

213244
}

example/AsyncLogCommand.php

+6
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ public function handle()
4141
$asyncLogSubject = new AsyncLogSubject();
4242
$asyncLogSubject->addObserver(new AsyncLogObserverOfNumA());
4343
$asyncLogSubject->addObserver(new AsyncLogObserverOfNumB());
44+
$asyncLogSubject->onException(function ($message) {
45+
$this->error('发现异常情况,具体的请查看日志,大致的错误信息如下所示:');
46+
dump($message);
47+
});
48+
49+
4450
$asyncLogSubject->handle();
4551
}
4652

0 commit comments

Comments
 (0)