Compare commits

...

16 Commits

Author SHA1 Message Date
as2252258 7479bed4e4 改名 2021-11-19 17:37:50 +08:00
as2252258 39394f76d5 改名 2021-11-19 14:46:07 +08:00
as2252258 065555a80e 改名 2021-11-18 18:06:45 +08:00
as2252258 13a8ca73bd 改名 2021-11-18 18:01:03 +08:00
as2252258 8456e1b7d5 改名 2021-11-18 17:05:00 +08:00
as2252258 82b5650c8a 改名 2021-11-18 16:59:45 +08:00
as2252258 03601f2db6 改名 2021-11-18 16:54:15 +08:00
as2252258 a7082b76fd 改名 2021-11-18 16:40:57 +08:00
as2252258 e872e04da1 改名 2021-11-18 15:59:46 +08:00
as2252258 370b255862 改名 2021-11-18 15:57:37 +08:00
as2252258 d4b5bed960 改名 2021-11-18 15:37:10 +08:00
as2252258 740dc7ebbd 改名 2021-11-18 11:37:12 +08:00
as2252258 adc63be3e4 改名 2021-11-17 16:39:12 +08:00
as2252258 34432225c4 改名 2021-11-17 10:45:35 +08:00
as2252258 fd854b28a9 1 2021-11-15 01:15:36 +08:00
as2252258 ba43c969cf 改名 2021-11-05 18:41:27 +08:00
27 changed files with 146 additions and 388 deletions
+1 -61
View File
@@ -4,7 +4,7 @@ namespace Server\Abstracts;
use JetBrains\PhpStorm\Pure; use JetBrains\PhpStorm\Pure;
use Server\SInterface\OnProcessInterface; use Server\Contract\OnProcessInterface;
use Swoole\Coroutine; use Swoole\Coroutine;
use Swoole\Process; use Swoole\Process;
@@ -80,64 +80,4 @@ abstract class BaseProcess implements OnProcessInterface
} }
/**
* @return bool
*/
public function checkProcessIsStop(): bool
{
return $this->isStop === true;
}
/**
* @param Process $process
*/
public function signListen(Process $process): void
{
}
/**
*
*/
protected function exit(): void
{
putenv('process.status=idle');
}
/**
* @return bool
*/
#[Pure] public function isWorking(): bool
{
return env('process.status', 'working') == 'working';
}
/**
*
*/
private function waiteExit(Process $process): void
{
$this->onProcessStop();
while ($this->isWorking()) {
$this->sleep();
}
$process->exit(0);
}
/**
*
*/
private function sleep(): void
{
if ($this->enable_coroutine) {
Coroutine::sleep(0.1);
} else {
usleep(100);
}
}
} }
-27
View File
@@ -1,27 +0,0 @@
<?php
namespace Server\Abstracts;
use Kiri\Exception\ConfigException;
use Kiri\Kiri;
use Psr\EventDispatcher\EventDispatcherInterface;
use ReflectionException;
use Server\ServerManager;
/**
*
*/
class OnTaskerStart extends WorkerStart implements EventDispatcherInterface
{
/**
*/
public function dispatch(object $event)
{
ServerManager::setEnv('environmental', Kiri::TASK);
}
}
-31
View File
@@ -1,31 +0,0 @@
<?php
namespace Server\Abstracts;
use Annotation\Annotation;
use Annotation\Inject;
use Exception;
use Http\Handler\Router;
use Kiri\Abstracts\Config;
use Kiri\Di\NoteManager;
use Kiri\Exception\ConfigException;
use Kiri\Kiri;
use Psr\EventDispatcher\EventDispatcherInterface;
use ReflectionException;
use Server\ServerManager;
class OnWorkerStart extends WorkerStart implements EventDispatcherInterface
{
/**
* @param object $event
* @return void
* @throws Exception
*/
public function dispatch(object $event)
{
ServerManager::setEnv('environmental', Kiri::WORKER);
}
}
-47
View File
@@ -1,47 +0,0 @@
<?php
namespace Server\Abstracts;
use Annotation\Annotation;
use Annotation\Inject;
use Http\Handler\Router;
use Kiri\Abstracts\Config;
use Kiri\Di\NoteManager;
use Kiri\Exception\ConfigException;
use Kiri\Kiri;
class WorkerStart
{
/**
* @var Annotation
*/
#[Inject(Annotation::class)]
public Annotation $annotation;
/**
* @var Router
*/
#[Inject(Router::class)]
public Router $router;
/**
* @param $prefix
* @throws ConfigException
*/
protected function setProcessName($prefix)
{
if (Kiri::getPlatform()->isMac()) {
return;
}
$name = Config::get('id', 'system-service');
if (!empty($prefix)) {
$name .= '.' . $prefix;
}
swoole_set_process_name($name);
}
}
+1
View File
@@ -19,6 +19,7 @@ class Constant
const WORKER_EXIT = 'WorkerExit'; const WORKER_EXIT = 'WorkerExit';
const CONNECT = 'Connect'; const CONNECT = 'Connect';
const HANDSHAKE = 'handshake'; const HANDSHAKE = 'handshake';
const OPEN = 'open';
const DISCONNECT = 'disconnect'; const DISCONNECT = 'disconnect';
const MESSAGE = 'message'; const MESSAGE = 'message';
const RECEIVE = 'Receive'; const RECEIVE = 'Receive';
@@ -1,6 +1,6 @@
<?php <?php
namespace Server\SInterface; namespace Server\Contract;
interface OnBeforeShutdown interface OnBeforeShutdown
{ {
@@ -1,6 +1,6 @@
<?php <?php
namespace Server\SInterface; namespace Server\Contract;
use Swoole\Server; use Swoole\Server;
@@ -1,6 +1,6 @@
<?php <?php
namespace Server\SInterface; namespace Server\Contract;
use Swoole\Server; use Swoole\Server;
@@ -1,6 +1,6 @@
<?php <?php
namespace Server\SInterface; namespace Server\Contract;
use Swoole\Server; use Swoole\Server;
@@ -1,6 +1,6 @@
<?php <?php
namespace Server\SInterface; namespace Server\Contract;
use Swoole\Http\Request; use Swoole\Http\Request;
use Swoole\Http\Response; use Swoole\Http\Response;
@@ -1,6 +1,6 @@
<?php <?php
namespace Server\SInterface; namespace Server\Contract;
use Swoole\Server; use Swoole\Server;
use Swoole\WebSocket\Frame; use Swoole\WebSocket\Frame;
@@ -1,6 +1,6 @@
<?php <?php
namespace Server\SInterface; namespace Server\Contract;
use Swoole\Http\Request; use Swoole\Http\Request;
use Swoole\WebSocket\Server; use Swoole\WebSocket\Server;
@@ -1,6 +1,6 @@
<?php <?php
namespace Server\SInterface; namespace Server\Contract;
use Server\Abstracts\Server; use Server\Abstracts\Server;
@@ -1,12 +1,12 @@
<?php <?php
namespace Server\SInterface; namespace Server\Contract;
/** /**
* Interface OnPipeMessageInterface * Interface OnPipeMessageInterface
* @package Server\SInterface * @package Server\Contract
*/ */
interface OnPipeMessageInterface interface OnPipeMessageInterface
{ {
+25
View File
@@ -0,0 +1,25 @@
<?php
namespace Server\Contract;
use Swoole\Process;
/**
* Interface BaseProcess
* @package Contract
*/
interface OnProcessInterface
{
/**
* @param Process $process
*/
public function process(Process $process): void;
}
@@ -1,6 +1,6 @@
<?php <?php
namespace Server\SInterface; namespace Server\Contract;
use Swoole\Server; use Swoole\Server;
@@ -1,7 +1,7 @@
<?php <?php
namespace Server\SInterface; namespace Server\Contract;
use Swoole\Server; use Swoole\Server;
+8
View File
@@ -0,0 +1,8 @@
<?php
namespace Server\Events;
class OnServerBeforeStart
{
}
+1 -1
View File
@@ -5,7 +5,7 @@ namespace Server\Handler;
use Annotation\Inject; use Annotation\Inject;
use Server\Abstracts\Server; use Server\Abstracts\Server;
use Exception; use Exception;
use Server\SInterface\OnPipeMessageInterface; use Server\Contract\OnPipeMessageInterface;
use Kiri\Events\EventDispatch; use Kiri\Events\EventDispatch;
/** /**
+1 -1
View File
@@ -9,7 +9,7 @@ use Kiri\Abstracts\Logger;
use Kiri\Exception\ConfigException; use Kiri\Exception\ConfigException;
use Kiri\Kiri; use Kiri\Kiri;
use ReflectionException; use ReflectionException;
use Server\SInterface\OnTaskInterface; use Server\Contract\OnTaskInterface;
use Swoole\Server; use Swoole\Server;
+4 -17
View File
@@ -7,7 +7,7 @@ use Exception;
use Kiri\Abstracts\Config; use Kiri\Abstracts\Config;
use Kiri\Core\Help; use Kiri\Core\Help;
use Kiri\Events\EventDispatch; use Kiri\Events\EventDispatch;
use Kiri\Runtime; use Kiri\Kiri;
use Server\Events\OnAfterWorkerStart; use Server\Events\OnAfterWorkerStart;
use Server\Events\OnBeforeWorkerStart; use Server\Events\OnBeforeWorkerStart;
use Server\Events\OnTaskerStart as OnTaskStart; use Server\Events\OnTaskerStart as OnTaskStart;
@@ -15,7 +15,6 @@ use Server\Events\OnWorkerError;
use Server\Events\OnWorkerExit; use Server\Events\OnWorkerExit;
use Server\Events\OnWorkerStart; use Server\Events\OnWorkerStart;
use Server\Events\OnWorkerStop; use Server\Events\OnWorkerStop;
use Server\ServerManager;
use Swoole\Server; use Swoole\Server;
use Swoole\Timer; use Swoole\Timer;
@@ -46,28 +45,16 @@ class OnServerWorker extends \Server\Abstracts\Server
if ($workerId < $server->setting['worker_num']) { if ($workerId < $server->setting['worker_num']) {
$this->eventDispatch->dispatch(new OnWorkerStart($server, $workerId)); $this->eventDispatch->dispatch(new OnWorkerStart($server, $workerId));
$this->setProcessName(sprintf('Worker[%d].%d', $server->worker_pid, $workerId)); $this->setProcessName(sprintf('Worker[%d].%d', $server->worker_pid, $workerId));
set_env('environmental', Kiri::WORKER);
} else { } else {
$this->eventDispatch->dispatch(new OnTaskStart($server, $workerId)); $this->eventDispatch->dispatch(new OnTaskStart($server, $workerId));
$this->setProcessName(sprintf('Tasker[%d].%d', $server->worker_pid, $workerId)); $this->setProcessName(sprintf('Tasker[%d].%d', $server->worker_pid, $workerId));
set_env('environmental', Kiri::TASK);
} }
$this->eventDispatch->dispatch(new OnAfterWorkerStart()); $this->eventDispatch->dispatch(new OnAfterWorkerStart());
} }
/**
* @param OnBeforeWorkerStart $worker
* @throws Exception
*/
public function setConfigure(OnBeforeWorkerStart $worker)
{
ServerManager::setEnv('worker', $worker->workerId);
$serialize = file_get_contents(storage(Runtime::CONFIG_NAME));
if (!empty($serialize)) {
Config::sets(unserialize($serialize));
}
}
/** /**
* @param Server $server * @param Server $server
* @param int $workerId * @param int $workerId
@@ -87,7 +74,7 @@ class OnServerWorker extends \Server\Abstracts\Server
*/ */
public function onWorkerExit(Server $server, int $workerId) public function onWorkerExit(Server $server, int $workerId)
{ {
ServerManager::setEnv('state', 'exit'); set_env('state', 'exit');
$this->eventDispatch->dispatch(new OnWorkerExit($server, $workerId)); $this->eventDispatch->dispatch(new OnWorkerExit($server, $workerId));
} }
-12
View File
@@ -1,12 +0,0 @@
<?php
namespace Server\SInterface;
use Swoole\Http\Response;
interface OnDownloadInterface
{
public function dispatch(Response $response);
}
-43
View File
@@ -1,43 +0,0 @@
<?php
namespace Server\SInterface;
use Swoole\Process;
/**
* Interface BaseProcess
* @package SInterface
*/
interface OnProcessInterface
{
/**
* @param Process $process
* @return string
*/
public function getProcessName(Process $process): string;
/**
* @param Process $process
*/
public function signListen(Process $process): void;
/**
* @param Process $process
*/
public function onHandler(Process $process): void;
/**
*
*/
public function onProcessStop(): void;
}
-1
View File
@@ -8,7 +8,6 @@ use Exception;
use Http\Handler\Abstracts\HttpService; use Http\Handler\Abstracts\HttpService;
use JetBrains\PhpStorm\Pure; use JetBrains\PhpStorm\Pure;
use Kiri\Abstracts\Config; use Kiri\Abstracts\Config;
use Kiri\Error\LoggerProcess;
use Kiri\Events\EventDispatch; use Kiri\Events\EventDispatch;
use Kiri\Exception\ConfigException; use Kiri\Exception\ConfigException;
use Server\Events\OnShutdown; use Server\Events\OnShutdown;
+26 -35
View File
@@ -7,15 +7,10 @@ namespace Server;
use Annotation\Inject; use Annotation\Inject;
use Exception; use Exception;
use Kiri\Abstracts\Config; use Kiri\Abstracts\Config;
use Kiri\Events\EventProvider; use Kiri\Events\EventDispatch;
use Kiri\Exception\ConfigException; use Kiri\Exception\ConfigException;
use Kiri\Kiri; use Kiri\Kiri;
use Server\Abstracts\OnTaskerStart as TaskerDispatch; use Server\Events\OnServerBeforeStart;
use Server\Abstracts\OnWorkerStart as WorkerDispatch;
use Server\Events\OnBeforeWorkerStart;
use Server\Events\OnTaskerStart;
use Server\Events\OnWorkerStart;
use Server\Handler\OnServerWorker;
use Swoole\Coroutine; use Swoole\Coroutine;
use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputArgument;
@@ -35,10 +30,10 @@ class ServerCommand extends Command
/** /**
* @var EventProvider * @var EventDispatch
*/ */
#[Inject(EventProvider::class)] #[Inject(EventDispatch::class)]
public EventProvider $eventProvider; public EventDispatch $eventProvider;
/** /**
@@ -61,28 +56,22 @@ class ServerCommand extends Command
*/ */
public function execute(InputInterface $input, OutputInterface $output): int public function execute(InputInterface $input, OutputInterface $output): int
{ {
try { $manager = Kiri::app()->getServer();
$manager = Kiri::app()->getServer(); $manager->setDaemon((int)!is_null($input->getOption('daemon')));
$manager->setDaemon((int)!is_null($input->getOption('daemon'))); if (is_null($input->getArgument('action'))) {
if (is_null($input->getArgument('action'))) { $input->setArgument('action', 'restart');
$input->setArgument('action', 'restart');
}
if (!in_array($input->getArgument('action'), self::ACTIONS)) {
throw new Exception('I don\'t know what I want to do.');
}
if ($manager->isRunner() && $input->getArgument('action') == 'start') {
throw new Exception('Service is running. Please use restart.');
}
$manager->shutdown();
if ($input->getArgument('action') == 'stop') {
throw new Exception('shutdown success');
}
$this->generate_runtime_builder($manager);
} catch (\Throwable $throwable) {
$output->write(jTraceEx($throwable));
} finally {
return 1;
} }
if (!in_array($input->getArgument('action'), self::ACTIONS)) {
throw new Exception('I don\'t know what I want to do.');
}
if ($manager->isRunner() && $input->getArgument('action') == 'start') {
throw new Exception('Service is running. Please use restart.');
}
$manager->shutdown();
if ($input->getArgument('action') == 'stop') {
return 0;
}
return $this->generate_runtime_builder($manager);
} }
@@ -107,19 +96,21 @@ class ServerCommand extends Command
/** /**
* @param $manager * @param $manager
* @return int
* @throws ConfigException * @throws ConfigException
* @throws Exception * @throws Exception
*/ */
private function generate_runtime_builder($manager): void private function generate_runtime_builder($manager): int
{ {
$this->configure_set(); $this->configure_set();
Kiri::app()->getRouter()->read_files(); Kiri::app()->getRouter()->read_files();
$this->eventProvider->on(OnBeforeWorkerStart::class, [di(OnServerWorker::class), 'setConfigure']); $this->eventProvider->dispatch(new OnServerBeforeStart());
$this->eventProvider->on(OnWorkerStart::class, [di(WorkerDispatch::class), 'dispatch']);
$this->eventProvider->on(OnTaskerStart::class, [di(TaskerDispatch::class), 'dispatch']);
$manager->start(); $manager->start();
return 1;
} }
} }
+35 -100
View File
@@ -3,29 +3,29 @@
namespace Server; namespace Server;
use Annotation\Inject; use Annotation\Inject;
use Closure;
use Exception; use Exception;
use Kiri\Abstracts\Config; use Kiri\Abstracts\Config;
use Kiri\Di\ContainerInterface; use Kiri\Di\ContainerInterface;
use Kiri\Error\Logger;
use Kiri\Exception\ConfigException; use Kiri\Exception\ConfigException;
use Kiri\Kiri; use Kiri\Kiri;
use ReflectionException; use ReflectionException;
use Server\Abstracts\BaseProcess; use Server\Abstracts\BaseProcess;
use Server\Contract\OnCloseInterface;
use Server\Contract\OnConnectInterface;
use Server\Contract\OnDisconnectInterface;
use Server\Contract\OnHandshakeInterface;
use Server\Contract\OnMessageInterface;
use Server\Contract\OnPacketInterface;
use Server\Contract\OnProcessInterface;
use Server\Contract\OnReceiveInterface;
use Server\Contract\OnTaskInterface;
use Server\Handler\OnPipeMessage; use Server\Handler\OnPipeMessage;
use Server\Handler\OnServer; use Server\Handler\OnServer;
use Server\Handler\OnServerManager; use Server\Handler\OnServerManager;
use Server\Handler\OnServerReload; use Server\Handler\OnServerReload;
use Server\Handler\OnServerTask; use Server\Handler\OnServerTask;
use Server\Handler\OnServerWorker; use Server\Handler\OnServerWorker;
use Server\SInterface\OnCloseInterface;
use Server\SInterface\OnConnectInterface;
use Server\SInterface\OnDisconnectInterface;
use Server\SInterface\OnHandshakeInterface;
use Server\SInterface\OnMessageInterface;
use Server\SInterface\OnPacketInterface;
use Server\SInterface\OnProcessInterface;
use Server\SInterface\OnReceiveInterface;
use Server\SInterface\OnTaskInterface;
use Swoole\Http\Server as HServer; use Swoole\Http\Server as HServer;
use Swoole\Process; use Swoole\Process;
use Swoole\Server; use Swoole\Server;
@@ -40,12 +40,19 @@ use Swoole\WebSocket\Server as WServer;
class ServerManager class ServerManager
{ {
use TraitServer;
/** @var string */ /** @var string */
public string $host = ''; public string $host = '';
public int $port = 0; public int $port = 0;
#[Inject(Logger::class)]
public Logger $logger;
/** @var array<string,Port> */ /** @var array<string,Port> */
public array $ports = []; public array $ports = [];
@@ -109,7 +116,6 @@ class ServerManager
*/ */
public function addListener(string $type, string $host, int $port, int $mode, array $settings = []) public function addListener(string $type, string $host, int $port, int $mode, array $settings = [])
{ {
if ($this->checkPortIsAlready($port)) $this->stopServer($port);
if (!$this->server) { if (!$this->server) {
$this->createBaseServer($type, $host, $port, $mode, $settings); $this->createBaseServer($type, $host, $port, $mode, $settings);
} else { } else {
@@ -131,8 +137,7 @@ class ServerManager
foreach ($this->sortService($configs['ports']) as $config) { foreach ($this->sortService($configs['ports']) as $config) {
$this->startListenerHandler($context, $config, $daemon); $this->startListenerHandler($context, $config, $daemon);
} }
$this->bindCallback($this->server, [Constant::PIPE_MESSAGE => [OnPipeMessage::class, 'onPipeMessage']]); $this->bindCallback([Constant::PIPE_MESSAGE => [OnPipeMessage::class, 'onPipeMessage']]);
// $this->bindCallback($this->server, $this->getSystemEvents($configs));
} }
@@ -145,7 +150,7 @@ class ServerManager
{ {
$configs = Config::get('server', [], true); $configs = Config::get('server', [], true);
foreach ($this->sortService($configs['ports']) as $config) { foreach ($this->sortService($configs['ports']) as $config) {
if ($this->checkPortIsAlready($config['port'])) { if (checkPortIsAlready($config['port'])) {
return true; return true;
} }
} }
@@ -162,20 +167,15 @@ class ServerManager
if (is_string($customProcess)) { if (is_string($customProcess)) {
$customProcess = Kiri::getDi()->get($customProcess); $customProcess = Kiri::getDi()->get($customProcess);
} }
$process = new Process(function (Process $soloProcess) use ($customProcess) { $system = sprintf('[%s].process', Config::get('id', 'system-service'));
$system = sprintf('[%s].process[%d]', Config::get('id', 'system-service'), $soloProcess->pid); $process = new Process(function (Process $process) use ($customProcess, $system) {
if (Kiri::getPlatform()->isLinux()) { if (Kiri::getPlatform()->isLinux()) {
$soloProcess->name($system . '.' . $customProcess->getName() . ' start.'); $process->name($system . '(' . $customProcess->getName() . ')');
} }
echo "\033[36m[" . date('Y-m-d H:i:s') . "]\033[0m " . $system . $customProcess->getName() . ' start.' . PHP_EOL; $customProcess->process($process);
$customProcess->signListen($soloProcess); }, $customProcess->getRedirectStdinAndStdout(), $customProcess->getPipeType(), $customProcess->isEnableCoroutine());
$customProcess->onHandler($soloProcess); $this->logger->debug($system . ' ' . $customProcess->getName() . ' start.');
}, $this->container->setBindings($customProcess->getName(), $process);
$customProcess->getRedirectStdinAndStdout(),
$customProcess->getPipeType(),
$customProcess->isEnableCoroutine()
);
// $this->container->setBindings($customProcess::class, $process);
$this->server->addProcess($process); $this->server->addProcess($process);
} }
@@ -189,30 +189,6 @@ class ServerManager
} }
/**
* @param array $ports
* @return array
*/
public function sortService(array $ports): array
{
$array = [];
foreach ($ports as $port) {
if ($port['type'] == Constant::SERVER_TYPE_WEBSOCKET) {
array_unshift($array, $port);
} else if ($port['type'] == Constant::SERVER_TYPE_HTTP) {
if (!empty($array) && $array[0]['type'] == Constant::SERVER_TYPE_WEBSOCKET) {
$array[] = $port;
} else {
array_unshift($array, $port);
}
} else {
$array[] = $port;
}
}
return $array;
}
/** /**
* @param string $key * @param string $key
* @param string|int $value * @param string|int $value
@@ -256,6 +232,7 @@ class ServerManager
$config['settings']['log_file'] = storage('system.log'); $config['settings']['log_file'] = storage('system.log');
} }
$config['settings']['pid_file'] = storage('.swoole.pid'); $config['settings']['pid_file'] = storage('.swoole.pid');
$config['settings'][Constant::OPTION_ENABLE_REUSE_PORT] = true;
$config['events'] = $config['events'] ?? []; $config['events'] = $config['events'] ?? [];
return $config; return $config;
} }
@@ -273,7 +250,8 @@ class ServerManager
{ {
$id = Config::get('id', 'system-service'); $id = Config::get('id', 'system-service');
echo sprintf("\033[36m[" . date('Y-m-d H:i:s') . "]\033[0m [%s]$type service %s::%d start.", $id, $host, $port) . PHP_EOL; $this->logger->debug(sprintf('[%s]' . $type . ' service %s::%d start', $id, $host, $port));
/** @var Server\Port $service */ /** @var Server\Port $service */
$this->ports[$port] = $this->server->addlistener($host, $port, $mode); $this->ports[$port] = $this->server->addlistener($host, $port, $mode);
if ($this->ports[$port] === false) { if ($this->ports[$port] === false) {
@@ -293,22 +271,6 @@ class ServerManager
} }
/**
* @param int $port
* @param string $event
* @return Closure|array|null
*/
public function getPortCallback(int $port, string $event): Closure|array|null
{
/** @var Server\Port $_port */
$_port = $this->ports[$port] ?? null;
if (is_null($_port)) {
return null;
}
return $_port->getCallback($event);
}
/** /**
* @param string $type * @param string $type
* @param string $host * @param string $host
@@ -317,6 +279,7 @@ class ServerManager
* @param array $settings * @param array $settings
* @throws ReflectionException * @throws ReflectionException
* @throws ConfigException * @throws ConfigException
* @throws Exception
*/ */
private function createBaseServer(string $type, string $host, int $port, int $mode, array $settings = []) private function createBaseServer(string $type, string $host, int $port, int $mode, array $settings = [])
{ {
@@ -331,7 +294,7 @@ class ServerManager
$id = Config::get('id', 'system-service'); $id = Config::get('id', 'system-service');
echo sprintf("\033[36m[" . date('Y-m-d H:i:s') . "]\033[0m [%s]$type service %s::%d start.", $id, $host, $port) . PHP_EOL; $this->logger->debug(sprintf('[%s]' . $type . ' service %s::%d start', $id, $host, $port));
$this->addDefaultListener($settings); $this->addDefaultListener($settings);
} }
@@ -343,43 +306,16 @@ class ServerManager
*/ */
public function stopServer(int $port) public function stopServer(int $port)
{ {
if (!($pid = $this->checkPortIsAlready($port))) { if (!($pid = checkPortIsAlready($port))) {
return; return;
} }
while ($this->checkPortIsAlready($port)) { while (checkPortIsAlready($port)) {
Process::kill($pid, SIGTERM); Process::kill($pid, SIGTERM);
usleep(300); usleep(300);
} }
} }
/**
* @param $port
* @return bool|string
* @throws Exception
*/
private function checkPortIsAlready($port): bool|string
{
if (!Kiri::getPlatform()->isLinux()) {
exec("lsof -i :" . $port . " | grep -i 'LISTEN' | awk '{print $2}'", $output);
if (empty($output)) return false;
$output = explode(PHP_EOL, $output[0]);
return $output[0];
}
$serverPid = file_get_contents(storage('.swoole.pid'));
if (!empty($serverPid) && shell_exec('ps -ef | grep ' . $serverPid . ' | grep -v grep')) {
Process::kill($serverPid, SIGTERM);
}
exec('netstat -lnp | grep ' . $port . ' | grep "LISTEN" | awk \'{print $7}\'', $output);
if (empty($output)) {
return false;
}
return explode('/', $output[0])[0];
}
/** /**
* @param array $settings * @param array $settings
* @throws ReflectionException * @throws ReflectionException
@@ -475,20 +411,19 @@ class ServerManager
{ {
$task_use_object = $this->server->setting['task_object'] ?? $this->server->setting['task_use_object'] ?? false; $task_use_object = $this->server->setting['task_object'] ?? $this->server->setting['task_use_object'] ?? false;
$reflect = $this->container->getReflect(OnServerTask::class)?->newInstance(); $reflect = $this->container->getReflect(OnServerTask::class)?->newInstance();
$this->server->on('finish', $events[Constant::FINISH] ?? [$reflect, 'onFinish']);
if ($task_use_object || $this->server->setting['task_enable_coroutine']) { if ($task_use_object || $this->server->setting['task_enable_coroutine']) {
$this->server->on('task', $events[Constant::TASK] ?? [$reflect, 'onCoroutineTask']); $this->server->on('task', $events[Constant::TASK] ?? [$reflect, 'onCoroutineTask']);
} else { } else {
$this->server->on('task', $events[Constant::TASK] ?? [$reflect, 'onTask']); $this->server->on('task', $events[Constant::TASK] ?? [$reflect, 'onTask']);
} }
$this->server->on('finish', $events[Constant::FINISH] ?? [$reflect, 'onFinish']);
} }
/** /**
* @param Port|Server $server
* @param array|null $settings * @param array|null $settings
*/ */
public function bindCallback(Port|Server $server, ?array $settings = []) public function bindCallback(?array $settings = [])
{ {
// TODO: Implement bindCallback() method. // TODO: Implement bindCallback() method.
if (count($settings) < 1) { if (count($settings) < 1) {
+32
View File
@@ -0,0 +1,32 @@
<?php
namespace Server;
trait TraitServer
{
/**
* @param array $ports
* @return array
*/
public function sortService(array $ports): array
{
$array = [];
foreach ($ports as $port) {
if ($port['type'] == Constant::SERVER_TYPE_WEBSOCKET) {
array_unshift($array, $port);
} else if ($port['type'] == Constant::SERVER_TYPE_HTTP) {
if (!empty($array) && $array[0]['type'] == Constant::SERVER_TYPE_WEBSOCKET) {
$array[] = $port;
} else {
array_unshift($array, $port);
}
} else {
$array[] = $port;
}
}
return $array;
}
}