From 1f5572a1afb8b614f378203fcb009ddbedf27a6d Mon Sep 17 00:00:00 2001 From: Default Date: Sun, 23 Mar 2025 19:02:52 +0800 Subject: [PATCH] 1 --- code/extend/db/DatabaseManage.php | 115 -------- code/extend/db/mongo/MongoBase.php | 191 ------------- code/extend/ddl/DDLManage.php | 66 +++++ code/extend/ddl/DatabaseManage.ddl | Bin 0 -> 3744 bytes code/extend/ddl/MicroCore.ddl | Bin 0 -> 11120 bytes code/extend/ddl/MongoBase.ddl | Bin 0 -> 6032 bytes code/extend/minserver/MicroCore_bak.php | 302 --------------------- code/extend/minserver/ProcessSanitizer.php | 27 -- code/extend/minserver/QueueManage.php | 45 --- code/extend/minserver/Rout.php | 17 -- code/extend/minserver/ScheduledTasks.php | 19 -- code/extend/minserver/ServerConsole.php | 89 ------ code/extend/minserver/ServerCore.php | 87 ------ code/extend/minserver/ServerManage.php | 129 --------- 14 files changed, 66 insertions(+), 1021 deletions(-) delete mode 100644 code/extend/db/DatabaseManage.php delete mode 100644 code/extend/db/mongo/MongoBase.php create mode 100644 code/extend/ddl/DDLManage.php create mode 100644 code/extend/ddl/DatabaseManage.ddl create mode 100644 code/extend/ddl/MicroCore.ddl create mode 100644 code/extend/ddl/MongoBase.ddl delete mode 100644 code/extend/minserver/MicroCore_bak.php delete mode 100644 code/extend/minserver/ProcessSanitizer.php delete mode 100644 code/extend/minserver/QueueManage.php delete mode 100644 code/extend/minserver/Rout.php delete mode 100644 code/extend/minserver/ScheduledTasks.php delete mode 100644 code/extend/minserver/ServerConsole.php delete mode 100644 code/extend/minserver/ServerCore.php delete mode 100644 code/extend/minserver/ServerManage.php diff --git a/code/extend/db/DatabaseManage.php b/code/extend/db/DatabaseManage.php deleted file mode 100644 index 06f67b6..0000000 --- a/code/extend/db/DatabaseManage.php +++ /dev/null @@ -1,115 +0,0 @@ -setName('db:manage') - ->addArgument('action', \think\console\input\Argument::OPTIONAL, 'The action to perform: backup or init or seed') - ->setDescription('Manage the database: backup or initialize'); - } - - protected function execute(Input $input, Output $Output) - { - $strAction = $input->getArgument('action'); - - if ($strAction === 'backup') { - $this->backupDatabase($Output); - } elseif ($strAction === 'init') { - $this->initializeDatabase($Output); - } elseif ($strAction === 'seed') { - $this->seed($Output); - } else { - $Output->writeln("Invalid action. Use 'backup' or 'init'. or 'seed'"); - } - } - - private function seed(Output $Output) - { - $SeedManager = new SeedManager; - $Output->writeln("开始数据播种" . PHP_EOL); - $SeedManager->handle(); - $Output->writeln("数据播种结束"); - } - - private function backupDatabase(Output $Output) - { - $arrConfig = config('database.connections.mysql'); - $strDb = $arrConfig['database']; - $strUserName = $arrConfig['username']; - $strPwd = $arrConfig['password']; - $strHost = $arrConfig['hostname']; - $strBackupFile = app()->getRootPath() . 'database/schema/mysql-schema.dump'; - - $strTempFile = tempnam(sys_get_temp_dir(), 'mysql-schema-') . '.dump'; - - $strCmd = "mysqldump -h{$strHost} -u{$strUserName} -p{$strPwd} --no-data {$strDb} > {$strTempFile}"; - - system($strCmd, $intResultCode); - - if ($intResultCode === 0) { - if (file_exists($strBackupFile)) { - unlink($strBackupFile); - } - - if (rename($strTempFile, $strBackupFile)) { - $Output->writeln("Database backup successful: {$strBackupFile}"); - } else { - $Output->writeln("Failed to move backup file to destination."); - } - } else { - $Output->writeln("Database backup failed."); - unlink($strTempFile); - } - } - - private function initializeDatabase(Output $Output) - { - $arrConfig = config('database.connections.mysql'); - $strDb = $arrConfig['database']; - $strUserName = $arrConfig['username']; - $strPwd = $arrConfig['password']; - $strHost = $arrConfig['hostname']; - $strPort = $arrConfig['hostport']; - $strBackupFile = app()->getRootPath() . 'database/schema/mysql-schema.dump'; - - $checkTableQuery = "SHOW TABLES LIKE 'migrations'"; - $boolMigrateExists = Db::query($checkTableQuery); - - if (!empty($boolMigrateExists)) { - $Output->writeln("数据库已存在,跳过初始化导入"); - return; - } - - $strTempFile = tempnam(sys_get_temp_dir(), 'mysql-schema-') . '.dump'; - - if (!copy($strBackupFile, $strTempFile)) { - $Output->writeln("创建临时导入文件失败."); - return; - } - - $strCmd = "mysql -h{$strHost} -P{$strPort} -u{$strUserName} -p{$strPwd} {$strDb} < {$strTempFile}"; - - system($strCmd, $intResultCode); - - if ($intResultCode === 0) { - $Output->writeln("成功导入初始化文件"); - } else { - $Output->writeln("初始化文件导入失败"); - } - - unlink($strTempFile); - } -} diff --git a/code/extend/db/mongo/MongoBase.php b/code/extend/db/mongo/MongoBase.php deleted file mode 100644 index 582cb23..0000000 --- a/code/extend/db/mongo/MongoBase.php +++ /dev/null @@ -1,191 +0,0 @@ - 'mongodb://username:password@your_ip:27017', - // 'database' => 'your_database', - // ]; - - if (!self::$instance) { - self::$instance = new self(); - } - return self::$instance; - } - - /** - * 构造函数,初始化 MongoDB 连接 - * @param string $uri MongoDB 连接字符串 - * @param string $dbName 数据库名称 - */ - public function __construct() - { - try { - $arrConfig = config('mongodb'); - $strUri = sprintf('mongodb://%s:%s@%s:%s', $arrConfig['username'], $arrConfig['password'], $arrConfig['hostname'], $arrConfig['hostport']); - - $this->client = new Client($strUri); - $this->db = $this->client->selectDatabase($arrConfig['database']); - } catch (MongoDBException $e) { - throw new \Exception("MongoDB connection failed: " . $e->getMessage()); - } - } - - /** - * 获取下一个自增序列值 - * @param string $sequenceName 序列名称 - * @return int 自增 ID - */ - public function getNextSequence(string $sequenceName): int - { - try { - $counters = $this->db->selectCollection('counters'); - $result = $counters->findOneAndUpdate( - ['_id' => $sequenceName], - ['$inc' => ['sequence_value' => 1]], - [ - 'upsert' => true, - 'returnDocument' => \MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER - ] - ); - return $result->sequence_value ?? 1; - } catch (MongoDBException $e) { - throw new \Exception("Failed to generate sequence: " . $e->getMessage()); - } - } - - /** - * 插入单条数据 - * @param string $collection 集合名称 - * @param array $data 数据数组 - * @return mixed 插入的 ID - */ - public function insertOne(string $collection, array $data) - { - try { - $coll = $this->db->selectCollection($collection); - $data['created_at'] = new UTCDateTime(); // 自动添加创建时间 - $result = $coll->insertOne($data); - return $result->getInsertedId(); - } catch (MongoDBException $e) { - throw new \Exception("Insert failed: " . $e->getMessage()); - } - } - - public function getDb(): \MongoDB\Database - { - return $this->db; - } - - /** - * 插入多条数据 - * @param string $collection 集合名称 - * @param array $data 多条数据数组 - * @return array 插入的 ID 列表 - */ - public function insertMany(string $collection, array $data) - { - try { - $coll = $this->db->selectCollection($collection); - foreach ($data as &$item) { - $item['created_at'] = new UTCDateTime(); - } - $result = $coll->insertMany($data); - return $result->getInsertedIds(); - } catch (MongoDBException $e) { - throw new \Exception("Insert many failed: " . $e->getMessage()); - } - } - - /** - * 查询单条数据 - * @param string $collection 集合名称 - * @param array $filter 查询条件 - * @param array $options 查询选项 - * @return ?object 查询结果 - */ - public function findOne(string $collection, array $filter = [], array $options = []): ?object - { - try { - $coll = $this->db->selectCollection($collection); - return $coll->findOne($filter, $options); - } catch (MongoDBException $e) { - throw new \Exception("Find one failed: " . $e->getMessage()); - } - } - - /** - * 查询多条数据 - * @param string $collection 集合名称 - * @param array $filter 查询条件 - * @param array $options 查询选项 - * @return array 查询结果 - */ - public function findMany(string $collection, array $filter = [], array $options = []): array - { - try { - $coll = $this->db->selectCollection($collection); - $cursor = $coll->find($filter, $options); - return iterator_to_array($cursor); - } catch (MongoDBException $e) { - throw new \Exception("Find many failed: " . $e->getMessage()); - } - } - - /** - * 更新单条数据 - * @param string $collection 集合名称 - * @param array $filter 查询条件 - * @param array $update 更新内容 - * @param array $options 更新选项 - * @return int 受影响的文档数 - */ - public function updateOne(string $collection, array $filter, array $update, array $options = []): int - { - try { - $coll = $this->db->selectCollection($collection); - $update['$set']['updated_at'] = new UTCDateTime(); // 自动添加更新时间 - $result = $coll->updateOne($filter, $update, $options); - return $result->getModifiedCount(); - } catch (MongoDBException $e) { - throw new \Exception("Update one failed: " . $e->getMessage()); - } - } - - /** - * 删除数据 - * @param string $collection 集合名称 - * @param array $filter 查询条件 - * @return int 删除的文档数 - */ - public function delete(string $collection, array $filter): int - { - try { - $coll = $this->db->selectCollection($collection); - $result = $coll->deleteMany($filter); - return $result->getDeletedCount(); - } catch (MongoDBException $e) { - throw new \Exception("Delete failed: " . $e->getMessage()); - } - } -} diff --git a/code/extend/ddl/DDLManage.php b/code/extend/ddl/DDLManage.php new file mode 100644 index 0000000..4326d1e --- /dev/null +++ b/code/extend/ddl/DDLManage.php @@ -0,0 +1,66 @@ + 'extend/ddl/MicroCore.ddl', + 'MongoBase' => 'extend/ddl/MongoBase.ddl', + 'DatabaseManage' => 'extend/ddl/DatabaseManage.ddl', + ]; + + /** + * 加载指定模块 + * @param string $strModuleCode 模块编码 + * @return bool 加载是否成功 + */ + public static function load($strModuleCode) + { + if (isset(self::$arrLoadedModules[$strModuleCode])) { + return true; + } + + if (!isset(self::$arrModuleFiles[$strModuleCode])) { + return false; + } + + $filename = self::$arrModuleFiles[$strModuleCode]; + + $strFileName = root_path() . $filename; + + if (!file_exists($strFileName)) { + return false; + } + + if (load_module_file($strFileName)) { + self::$arrLoadedModules[$strModuleCode] = true; + return true; + } else { + return false; + } + } + + /** + * 检查模块是否已加载 + * @param string $strModuleCode 类名 + * @return bool + */ + public static function isLoaded($strModuleCode) + { + return isset(self::$arrLoadedModules[$strModuleCode]); + } + + /** + * 获取所有已加载的模块 + * @return array + */ + public static function getarrLoadedModules() + { + return array_keys(self::$arrLoadedModules); + } +} diff --git a/code/extend/ddl/DatabaseManage.ddl b/code/extend/ddl/DatabaseManage.ddl new file mode 100644 index 0000000000000000000000000000000000000000..e00387a0fe53df4d333e1296603fcddaf35d613c GIT binary patch literal 3744 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 CB&k{e literal 0 HcmV?d00001 diff --git a/code/extend/ddl/MongoBase.ddl b/code/extend/ddl/MongoBase.ddl new file mode 100644 index 0000000000000000000000000000000000000000..aeff78dded981f7add304593c4664f6397119ce1 GIT binary patch literal 6032 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'cache'); - } - - static public function reloadDb() - { - Db::close(); - Container::getInstance()->delete('think\DbManager'); - } - - static public function destructConnectSource() - { - self::reloadDb(); - self::reloadRedis(); - } -} - - - -class QueueManage -{ - public $strQueueName = ''; - - static private $arrObj = []; - - static public function getInstance($intIndex = 1, $strQueueName = '') - { - $strKey = $intIndex . '-' . $strQueueName; - - if (!key_exists($strKey, self::$arrObj)) { - self::$arrObj[$strKey] = new self($intIndex, $strQueueName); - } - return self::$arrObj[$strKey]; - } - - public function __construct($intIndex = 1, $strQueueName = '') - { - if ($strQueueName == '') { - $arrConfig = config('task.queue'); - $strQueueName = $arrConfig[$intIndex]['name']; - } - - $this->strQueueName = $strQueueName; - } - - public function get() - { - return Cache::store('redis')->lpop($this->strQueueName); - } - - public function set($arrData) - { - $strData = json_encode($arrData); - return Cache::store('redis')->rpush($this->strQueueName, $strData); - } -} - - -class Rout -{ - static public function httpDispense(\Swoole\Http\Request $Request, \Swoole\Http\Response $Response) - { - $Response->status(999, 'Hei Guys ~'); - $Response->header("Content-Type", "text/html; charset=utf-8"); - $Response->end("

Hello reptile~. #" . rand(1000, 9999) . "

"); - } - - static public function tcpDispense(\Swoole\Server $server, $fd, $reactor_id, $mixedData) {} -} - - - -class ScheduledTasks -{ - static public function hander($arrProcessTask = []) - { - ProcessSanitizer::destructConnectSource(); - - call_user_func($arrProcessTask['callback'], $arrProcessTask['param']); - - sleep($arrProcessTask['execution_interval']); - } -} - - - -class ServerCore -{ - private $arrConfig; - - private static $obj; - - private $Server; - - static $Process = NULL; - - static function instance($arrConfig) - { - if (self::$obj == null) { - self::$obj = new self($arrConfig); - } - return self::$obj; - } - - public function __construct($arrConfig) - { - $this->arrConfig = $arrConfig; - $this->createServer(); - } - - private function serHttpConfig() - { - $this->Server->set($this->filterConfig()); - $this->Server->on('request', [Rout::class, 'httpDispense']); - } - - private function filterConfig() - { - $arrConfig = $this->arrConfig; - unset($arrConfig['host']); - unset($arrConfig['port']); - unset($arrConfig['mode']); - unset($arrConfig['sockType']); - unset($arrConfig['server_type']); - return $arrConfig; - } - - private function serTcpConfig() - { - $this->Server->set($this->filterConfig()); - $this->Server->on('receive', [Rout::class, 'tcpDispense']); - } - - private function createServer() - { - switch ($this->arrConfig['server_type']) { - case 'HTTP': - $this->Server = new \Swoole\Http\Server($this->arrConfig['host'], $this->arrConfig['port']); - $this->serHttpConfig(); - break; - default: - $this->Server = new \Swoole\Server($this->arrConfig['host'], $this->arrConfig['port'], $this->arrConfig['mode'], $this->arrConfig['sockType']); - $this->serTcpConfig(); - break; - } - - $this->Server->on('task', [$this, 'onTask']); - - $this->Server->on('finish', [$this, 'onFinish']); - } - - public function getServer() - { - return $this->Server; - } - - public function onTask($Http, $task_id, $from_id, $arrData) - { - $mixedResult = call_user_func_array($arrData[0], $arrData[1]); - - $Http->finish($mixedResult); - } - - public function onFinish($Http, $task_id, $mixedData) {} -} - - - -class ServerManage -{ - static $HttpService; - - static $arrDynamicConfig = []; - - public function __init($arrArgvs = []) - { - $this->setConfigDaemonize($arrArgvs[0]['daemonize'] ?? 'false'); - } - - private function setConfigDaemonize($strMode) - { - self::$arrDynamicConfig['daemonize'] = (bool)$strMode; - } - - private function getPid() - { - return file_exists(config('task.service.pid_file')) ? file_get_contents(config('task.service.pid_file')) : NULL; - } - - public function start($arrArgvs = []) - { - $this->__init($arrArgvs); - - $intPid = (int)$this->getPid(); - - if ($intPid > 0 && \Swoole\Process::kill($intPid, SIG_DFL)) { - echo " Service is \e[0;32mRunning\e[0m ! " . PHP_EOL; - exit; - } - echo " Execute the \e[0;32m start\e[0m command ...... " . PHP_EOL; - - $this->createService(); - - $this->addProcessList(); - - $this->addScheduledTasks(); - - self::$HttpService->getServer()->start(); - } - - public function stop($arrArgvs = []) - { - $this->__init($arrArgvs); - - $intPid = (int)$this->getPid(); - - if ($intPid <= 0) { - echo " Service is \e[0;31mStop\e[0m ! " . PHP_EOL; - } else { - echo " Execute the \e[0;32m stop\e[0m command ...... " . PHP_EOL; - \Swoole\Process::kill($intPid, SIGTERM); - echo " Service is \e[0;31mStop\e[0m ! " . PHP_EOL; - } - } - - public function status($arrArgvs = []) - { - $this->__init($arrArgvs); - - $intPid = (int)$this->getPid(); - - if ($intPid <= 0) { - echo " Service is \e[0;31mStop\e[0m ! " . PHP_EOL; - } else if (\Swoole\Process::kill($intPid, SIG_DFL)) { - echo " Service is \e[0;32mRunning\e[0m ! " . PHP_EOL; - } else { - echo " Service is \e[0;31mStop\e[0m ! " . PHP_EOL; - } - } - - public function restart($arrArgvs = []) - { - $this->__init($arrArgvs); - - $intPid = (int)$this->getPid(); - - if ($intPid <= 0) { - echo " \e[0;31m Get Pid Error\e[0m !" . PHP_EOL; - echo " Execute the \e[0;32m start\e[0m command ...... " . PHP_EOL; - $this->start(); - } else { - echo " Execute the \e[0;32m restart\e[0m command ...... " . PHP_EOL; - \Swoole\Process::kill($intPid, SIGUSR1); - } - } - - private function addScheduledTasks() - { - if (config('task.scheduled_tasks_pool')) { - foreach (config('task.scheduled_tasks_pool') as $arrProcessTask) { - if ($arrProcessTask['status']) { - $Process = new \Swoole\Process(function () use ($arrProcessTask) { - call_user_func([ScheduledTasks::class, 'hander'], $arrProcessTask); - }); - self::$HttpService->getServer()->addProcess($Process); - } - } - } - } - - private function addProcessList() - { - if (config('task.process_pool')) { - foreach (config('task.process_pool') as $v) { - for ($i = 0; $i < $v['Num']; $i++) { - $Process = new \Swoole\Process($v['callback']); - - self::$HttpService->getServer()->addProcess($Process); - } - } - } - } - - private function createService() - { - $arrHttpServiceConfig = array_merge(config('task.service'), self::$arrDynamicConfig); - - self::$HttpService = ServerCore::instance($arrHttpServiceConfig); - } -} diff --git a/code/extend/minserver/ProcessSanitizer.php b/code/extend/minserver/ProcessSanitizer.php deleted file mode 100644 index f507515..0000000 --- a/code/extend/minserver/ProcessSanitizer.php +++ /dev/null @@ -1,27 +0,0 @@ -delete('cache'); - } - - static public function reloadDb() - { - Db::close(); - Container::getInstance()->delete('think\DbManager'); - } - - static public function destructConnectSource() - { - self::reloadDb(); - self::reloadRedis(); - } -} \ No newline at end of file diff --git a/code/extend/minserver/QueueManage.php b/code/extend/minserver/QueueManage.php deleted file mode 100644 index 8e856d4..0000000 --- a/code/extend/minserver/QueueManage.php +++ /dev/null @@ -1,45 +0,0 @@ -strQueueName = $strQueueName; - } - - public function get() - { - return Cache::store('redis')->lpop($this->strQueueName); - } - - public function set($arrData) - { - $strData = json_encode($arrData); - return Cache::store('redis')->rpush($this->strQueueName, $strData); - } -} diff --git a/code/extend/minserver/Rout.php b/code/extend/minserver/Rout.php deleted file mode 100644 index 4d088d9..0000000 --- a/code/extend/minserver/Rout.php +++ /dev/null @@ -1,17 +0,0 @@ -status(999, 'Hei Guys ~'); - $Response->header("Content-Type", "text/html; charset=utf-8"); - $Response->end("

Hello reptile~. #" . rand(1000, 9999) . "

"); - } - - static public function tcpDispense(\Swoole\Server $server, $fd, $reactor_id, $mixedData) {} -} diff --git a/code/extend/minserver/ScheduledTasks.php b/code/extend/minserver/ScheduledTasks.php deleted file mode 100644 index 06cb867..0000000 --- a/code/extend/minserver/ScheduledTasks.php +++ /dev/null @@ -1,19 +0,0 @@ - ['start', 'stop', 'restart', 'status',], - 'daemonize' => ['d', "false",], - 'forcibly' => ['f', "false",], - ]; - - private $arrReflection = [ - \minserver\ServerManage::class, - ]; - - protected function configure() - { - $this->setName('php think task') - ->addArgument('action', Argument::REQUIRED, "action: (" . implode('|', $this->arrArguments['action']) . ')') - ->addOption('daemonize', 'd', Option::VALUE_NONE, "daemonize start service") - ->addOption('forcibly', 'f', Option::VALUE_NONE, "ignore user forcibly start service") - ->setDescription('swoole task server') - ->setHelp('php think task [-d] [-f] run server'); - } - - - protected function checkUser(Input $Input) - { - - if (!$Input->getOption('forcibly')) { - $strUser = get_current_user(); - - if ($strUser == 'root') { - $strError = sprintf("Sorry , Can't start service by [%s] user!,\n but you can add option '-f' forcibly start on you debug ,\n Do not use in production environment !!!!!!!!!",$strUser); - throw new \InvalidArgumentException($strError); - } - - if ($strUser != 'www') { - throw new \InvalidArgumentException("Sorry , Can't start service by [{$strUser}] user!, please use [www] user !"); - } - } - } - - protected function execute(Input $Input, Output $Output) - { - - $this->checkArguments(['action'], $Input, $Output); - - $strAction = trim($Input->getArgument('action')); - - if ($strAction == 'start' || $strAction == 'restart') { - $this->checkUser($Input); - } - - $arrArgs = array_merge($Input->getArguments(), $Input->getOptions()); - - $this->{$strAction}($arrArgs); - } - - private function checkArguments($arrArguments, Input $Input) - { - foreach ($arrArguments as $strArguments) { - $strVal = trim($Input->getArgument($strArguments)); - - if (!in_array($strVal, $this->arrArguments[$strArguments])) { - throw new \InvalidArgumentException("Arguments [{$strVal}] is not defined! Optional parameters [" . implode(' ', $this->arrArguments[$strArguments]) . "] !"); - } - } - } - - public function __call($strAction, $arrArguments) - { - foreach ($this->arrReflection as $strClass) { - if (method_exists($strClass, $strAction)) { - return call_user_func([new $strClass, $strAction], $arrArguments); - } - } - throw new \InvalidArgumentException("Action [{$strAction}] no method available! "); - } -} diff --git a/code/extend/minserver/ServerCore.php b/code/extend/minserver/ServerCore.php deleted file mode 100644 index b8f348e..0000000 --- a/code/extend/minserver/ServerCore.php +++ /dev/null @@ -1,87 +0,0 @@ -arrConfig = $arrConfig; - $this->createServer(); - } - - private function serHttpConfig() - { - $this->Server->set($this->filterConfig()); - $this->Server->on('request', [\minserver\Rout::class, 'httpDispense']); - } - - private function filterConfig() - { - $arrConfig = $this->arrConfig; - unset($arrConfig['host']); - unset($arrConfig['port']); - unset($arrConfig['mode']); - unset($arrConfig['sockType']); - unset($arrConfig['server_type']); - return $arrConfig; - } - - private function serTcpConfig() - { - $this->Server->set($this->filterConfig()); - $this->Server->on('receive', [\minserver\Rout::class, 'tcpDispense']); - } - - private function createServer() - { - switch ($this->arrConfig['server_type']) { - case 'HTTP': - $this->Server = new \Swoole\Http\Server($this->arrConfig['host'], $this->arrConfig['port']); - $this->serHttpConfig(); - break; - default: - $this->Server = new \Swoole\Server($this->arrConfig['host'], $this->arrConfig['port'], $this->arrConfig['mode'], $this->arrConfig['sockType']); - $this->serTcpConfig(); - break; - } - - $this->Server->on('task', [$this, 'onTask']); - - $this->Server->on('finish', [$this, 'onFinish']); - } - - public function getServer() - { - return $this->Server; - } - - public function onTask($Http, $task_id, $from_id, $arrData) - { - $mixedResult = call_user_func_array($arrData[0], $arrData[1]); - - $Http->finish($mixedResult); - } - - public function onFinish($Http, $task_id, $mixedData) - { - } -} diff --git a/code/extend/minserver/ServerManage.php b/code/extend/minserver/ServerManage.php deleted file mode 100644 index f46e7c1..0000000 --- a/code/extend/minserver/ServerManage.php +++ /dev/null @@ -1,129 +0,0 @@ -setConfigDaemonize($arrArgvs[0]['daemonize'] ?? 'false'); - } - - private function setConfigDaemonize($strMode) - { - self::$arrDynamicConfig['daemonize'] = (bool)$strMode; - } - - private function getPid() - { - return file_exists(config('task.service.pid_file')) ? file_get_contents(config('task.service.pid_file')) : NULL; - } - - public function start($arrArgvs = []) - { - $this->__init($arrArgvs); - - $intPid = (int)$this->getPid(); - - if ($intPid > 0 && \Swoole\Process::kill($intPid, SIG_DFL)) { - echo " Service is \e[0;32mRunning\e[0m ! " . PHP_EOL; - exit; - } - echo " Execute the \e[0;32m start\e[0m command ...... " . PHP_EOL; - - $this->createService(); - - $this->addProcessList(); - - $this->addScheduledTasks(); - - self::$HttpService->getServer()->start(); - - } - - public function stop($arrArgvs = []) - { - $this->__init($arrArgvs); - - $intPid = (int)$this->getPid(); - - if ($intPid <= 0) { - echo " Service is \e[0;31mStop\e[0m ! " . PHP_EOL; - } else { - echo " Execute the \e[0;32m stop\e[0m command ...... " . PHP_EOL; - \Swoole\Process::kill($intPid, SIGTERM); - echo " Service is \e[0;31mStop\e[0m ! " . PHP_EOL; - } - } - - public function status($arrArgvs = []) - { - $this->__init($arrArgvs); - - $intPid = (int)$this->getPid(); - - if ($intPid <= 0) { - echo " Service is \e[0;31mStop\e[0m ! " . PHP_EOL; - } else if (\Swoole\Process::kill($intPid, SIG_DFL)) { - echo " Service is \e[0;32mRunning\e[0m ! " . PHP_EOL; - } else { - echo " Service is \e[0;31mStop\e[0m ! " . PHP_EOL; - } - } - - public function restart($arrArgvs = []) - { - $this->__init($arrArgvs); - - $intPid = (int)$this->getPid(); - - if ($intPid <= 0) { - echo " \e[0;31m Get Pid Error\e[0m !" . PHP_EOL; - echo " Execute the \e[0;32m start\e[0m command ...... " . PHP_EOL; - $this->start(); - } else { - echo " Execute the \e[0;32m restart\e[0m command ...... " . PHP_EOL; - \Swoole\Process::kill($intPid, SIGUSR1); - } - } - - private function addScheduledTasks() - { - if (config('task.scheduled_tasks_pool')) { - foreach (config('task.scheduled_tasks_pool') as $arrProcessTask) { - if ($arrProcessTask['status']) { - $Process = new \Swoole\Process(function () use ($arrProcessTask) { - call_user_func([\minserver\ScheduledTasks::class, 'hander'], $arrProcessTask); - }); - self::$HttpService->getServer()->addProcess($Process); - } - } - } - } - - private function addProcessList() - { - if (config('task.process_pool')) { - foreach (config('task.process_pool') as $v) { - for ($i = 0; $i < $v['Num']; $i++) { - $Process = new \Swoole\Process($v['callback']); - - self::$HttpService->getServer()->addProcess($Process); - } - } - } - } - - private function createService() - { - $arrHttpServiceConfig = array_merge(config('task.service'), self::$arrDynamicConfig); - - self::$HttpService = ServerCore::instance($arrHttpServiceConfig); - } -}