Files
admin/module/Application/src/Command/Swoole/Server/SwTaskCommand.php
2025-09-13 01:22:15 +08:00

84 lines
2.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
*
* @authorllbjj
* @DateTime2022/9/1 15:00
* @Description
*
*/
namespace Application\Command\Swoole\Server;
use Application\Command\BasicCommand;
use Application\Service\Extension\ErrorHandler;
use Application\Service\Extension\Laminas;
use Swoole\Server;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class SwTaskCommand extends BasicCommand{
function execute(InputInterface $input, OutputInterface $output)
{
error_reporting(0);
$tcpSv = new Server('127.0.0.1', 9511);
$tcpSv->set([
'worker_num' => 4, // 工作进程数量
'task_worker_num' => 8, // 异步任务进程数
'open_eof_check' => true, //打开EOF检测
'package_eof' => '|PHENOL|', //设置EOF
'package_max_length' => 1024 * 1024 * 5,
'dispatch_mode' => 3,
'task_ipc_mode' => 2,
// 'daemonize' => 1, //以守护进程 1或0
// 'open_eof_split' => true, //swoole底层实现自动分包。比较消耗cpu资源
// 'package_eof' => "|PHENOL|", //设置后缀,一般为"
]);
//接收数据
$tcpSv->on('receive', function ($sv, $fd, $reactorId, $data) use($output) {
$sendDataArr = array_filter(explode('|PHENOL|', $data));
if(!empty($sendDataArr)) {
foreach($sendDataArr as $sendData) {
$sv->task($sendData);
}
}
});
// 定义异步任务
$tcpSv->on('task', function($sv, $task_id, $src_work_id, $data) use ($output){
$taskData = json_decode($data, true);
try {
// 设置Token
Laminas::$token = $taskData['token'] ?? '';
// 调用方法,
$result = $this->LocalService()->{$taskData['svName']}->{$taskData['methodName']}($taskData['params']);
$sv->finish("{$data}");
}catch (\Throwable $throwable) {
$this->saveErrLog($throwable, $taskData);
}
});
//处理异步任务的结果(此回调函数在worker进程中执行)
$tcpSv->on('Finish', function ($serv, $task_id, $data) {
$taskData = json_decode($data, true);
// 发送完成通知
$msgData = [
'title' => "{$taskData['domainName']}】异步任务 {$taskData['svName']}->{$taskData['methodName']}() 执行完成!",
'description' => "AsyncTask[{$task_id}] Finish: {$data}",
'url' => '#'
];
$this->LocalService()->wechatWork->sendMesToUser($msgData);
echo "AsyncTask[{$task_id}] Finish: {$data} -> OK".PHP_EOL;
});
$tcpSv->start();
return 0;
}
public function saveErrLog(&$throwable, &$taskData) {
ErrorHandler::log2txt($throwable, '', $taskData);
}
}