Skip to content

Commit e76ca6a

Browse files
committed
add ApiExcelSwoole 异步事件
1 parent e5af779 commit e76ca6a

File tree

2 files changed

+106
-0
lines changed

2 files changed

+106
-0
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
/**
3+
* 创建事件类--异步事件
4+
* 此特性依赖Swoole的AsyncTask,必须先设置config/laravels.php的swoole.task_worker_num。
5+
* 异步事件的处理能力受Task进程数影响,需合理设置task_worker_num。
6+
* User: lisgroup
7+
* Date: 20-06-05
8+
* Time: 下午01:31
9+
*/
10+
11+
namespace App\Events;
12+
13+
use Hhxsv5\LaravelS\Swoole\Task\Event;
14+
15+
class ApiExcelSwooleEvent extends Event
16+
{
17+
private $data;
18+
19+
public function __construct($data)
20+
{
21+
$this->data = $data;
22+
}
23+
24+
public function getData()
25+
{
26+
return $this->data;
27+
}
28+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?php
2+
3+
/**
4+
* 创建监听器类
5+
* User: lisgroup
6+
* Date: 20-06-05
7+
* Time: 下午01:51
8+
*/
9+
10+
namespace App\Listeners;
11+
12+
13+
use App\Http\Repository\MultithreadingRepository;
14+
use App\Models\ApiExcel;
15+
use Hhxsv5\LaravelS\Swoole\Task\Event;
16+
use Hhxsv5\LaravelS\Swoole\Task\Listener;
17+
18+
class ApiExcelSwooleListener extends Listener
19+
{
20+
// 声明没有参数的构造函数
21+
public function __construct()
22+
{
23+
}
24+
25+
public function handle(Event $event)
26+
{
27+
\Log::info(__CLASS__.':handle start', [$event->getData()]);
28+
// 获取事件中保存的数据
29+
// $data = ['id' => 6, 'state' => 1, 'upload_url' => '/storage/20190318_103542_5c8f03fe14d89.xlsx'];
30+
$data = $event->getData();
31+
// 根据状态处理数据
32+
switch ($data['state']) {
33+
case 1:
34+
// 根据 upload 上传的数据批量测试数据
35+
$path = public_path($data['upload_url']);
36+
if ($data['state'] == 1 && file_exists($path)) {
37+
// 获取 appkey 和 url
38+
$apiExcel = ApiExcel::find($data['id']);
39+
$param = $apiExcel->apiParam()->first();
40+
if ($param) {
41+
$multi = MultithreadingRepository::getInstent();
42+
$multi->setApiExcelId($data['id']);
43+
$multi->setParam($path, ['concurrent' => $apiExcel->concurrent]);
44+
$is_open = $apiExcel->concurrent > 1;
45+
$result = $multi->newMultiRequest($param->url, $apiExcel->appkey, $is_open);
46+
47+
ksort($result);
48+
49+
// 正式上线后注释下一行
50+
\Log::info('ID-'.$data['id'].'-result: ', $result);
51+
if (!$result) {
52+
// 更新任务失败
53+
$apiExcel->state = 5;
54+
$apiExcel->save();
55+
throw new \Exception(date('Y-m-d H:i:s').' 任务失败: 第三方请求错误~!'.$param['url']);
56+
}
57+
58+
/************************* 2. 写入 Excel 文件 ******************************/
59+
$fileName = $multi->saveExcel($param, $result);
60+
61+
if (!$fileName) {
62+
throw new \Exception(date('Y-m-d H:i:s').' 任务失败: Writer\Exception~!');
63+
}
64+
65+
// 更新任务状态
66+
$apiExcel->state = 2;
67+
$apiExcel->finish_url = $fileName;
68+
$apiExcel->save();
69+
}
70+
} else {
71+
\Log::info(__CLASS__.':handle out', [$event->getData()]);
72+
}
73+
break;
74+
default:
75+
break;
76+
}
77+
}
78+
}

0 commit comments

Comments
 (0)