This commit is contained in:
xl
2023-05-26 11:16:43 +08:00
parent 9327b74bdc
commit 5f68ae9e48
2 changed files with 146 additions and 152 deletions
+146 -151
View File
@@ -17,175 +17,170 @@ trait TraitServer
{ {
private array $_process = []; private array $_process = [];
/** /**
* @param string|array|BaseProcess $class * @param string|array|BaseProcess $class
* @return void * @return void
* @throws Exception * @throws Exception
*/ */
public function addProcess(string|array|BaseProcess $class): void public function addProcess(string|array|BaseProcess $class): void
{ {
if (!is_array($class)) { if (!is_array($class)) {
$class = [$class]; $class = [$class];
} }
foreach ($class as $name) { foreach ($class as $name) {
if (is_string($name)) { if (is_string($name)) {
$name = Kiri::getDi()->get($name); $name = Kiri::getDi()->get($name);
} }
if (isset($this->_process[$name->getName()])) { if (isset($this->_process[$name->getName()])) {
throw new Exception('Process(' . $name->getName() . ') is exists.'); throw new Exception('Process(' . $name->getName() . ') is exists.');
} }
$this->_process[$name->getName()] = $this->genProcess($name); $this->_process[$name->getName()] = $this->genProcess($name);
} }
} }
/** /**
* @param BaseProcess $name * @param BaseProcess $name
* @return Process * @return Process
*/ */
private function genProcess(BaseProcess $name): Process private function genProcess(BaseProcess $name): Process
{ {
return new Process(function (Process $process) use ($name) { return new Process(function (Process $process) use ($name) {
$process->name($name->getName()); $process->name($name->getName());
$name->onSigterm()->process($process); $name->onSigterm()->process($process);
}, },
$name->getRedirectStdinAndStdout(), $name->getRedirectStdinAndStdout(),
$name->getPipeType(), $name->getPipeType(),
$name->isEnableCoroutine()); $name->isEnableCoroutine());
} }
/** /**
* @return void * @return void
* @throws Exception * @throws Exception
*/ */
public function onSignal(): void public function onSignal(): void
{ {
$signal = \config('signal', []); $signal = \config('signal', []);
$this->onPcntlSignal(SIGINT, [$this, 'onSigint']); $this->onPcntlSignal(SIGINT, [$this, 'onSigint']);
foreach ($signal as $sig => $value) { foreach ($signal as $sig => $value) {
if (is_array($value) && is_string($value[0])) { if (is_array($value) && is_string($value[0])) {
$value[0] = \Kiri::getDi()->get($value[0]); $value[0] = \Kiri::getDi()->get($value[0]);
} }
if (!is_callable($value, true)) { if (!is_callable($value, true)) {
throw new Exception('Register signal callback must can exec.'); throw new Exception('Register signal callback must can exec.');
} }
$this->onPcntlSignal($sig, $value); $this->onPcntlSignal($sig, $value);
} }
} }
/** /**
* @param $signal * @param $signal
* @param $callback * @param $callback
* @return void * @return void
*/ */
private function onPcntlSignal($signal, $callback): void private function onPcntlSignal($signal, $callback): void
{ {
// if (get_called_class() != CoroutineServer::class) { pcntl_signal(SIGINT, [$this, 'onSigint']);
pcntl_signal(SIGINT, [$this, 'onSigint']); }
// } else {
// Coroutine::create(static function () use ($signal, $callback) {
// $data = Coroutine::waitSignal($signal);
// if ($data) {
// $callback($signal, [true]);
// }
// });
// }
}
/** /**
* @return array * @return array
*/ */
public function getProcess(): array public function getProcess(): array
{ {
return $this->_process; return $this->_process;
} }
/** /**
* @param array $ports * @param array $ports
* @return array * @return array
*/ * @throws ReflectionException
public function sortService(array $ports): array */
{ public function sortService(array $ports): array
$array = []; {
foreach ($ports as $port) { $array = [];
if ($port['type'] == Constant::SERVER_TYPE_WEBSOCKET) { foreach ($ports as $port) {
array_unshift($array, $port); $array = $this->sort($array, $port);
} else if ($port['type'] == Constant::SERVER_TYPE_HTTP) { }
if (!empty($array) && $array[0]['type'] == Constant::SERVER_TYPE_WEBSOCKET) { return $array;
$array[] = $port; }
} else {
array_unshift($array, $port);
}
} else {
$array[] = $port;
}
}
return $array;
}
/** /**
* @param array $ports * @param array $ports
* @return array<Config> * @return array<Config>
* @throws ReflectionException * @throws ReflectionException
*/ */
public function genConfigService(array $ports): array public function genConfigService(array $ports): array
{ {
$array = []; $array = [];
$ports = $ports['ports'] ?? []; $ports = $ports['ports'] ?? [];
foreach ($ports as $port) { foreach ($ports as $port) {
$config = \Kiri::getDi()->make(Config::class, [], $port); $array = $this->sort($array, $port);
if ($port['type'] == Constant::SERVER_TYPE_WEBSOCKET) { }
array_unshift($array, $config); return $array;
} else if ($port['type'] == Constant::SERVER_TYPE_HTTP) { }
if (!empty($array) && $array[0]['type'] == Constant::SERVER_TYPE_WEBSOCKET) {
$array[] = $config;
} else {
array_unshift($array, $config);
}
} else {
$array[] = $config;
}
}
return $array;
}
/** /**
* @param $type * @param array $array
* @return string|null * @param $port
*/ * @return array
public function getServerClass($type): ?string * @throws ReflectionException
{ */
return match ($type) { private function sort(array $array, $port): array
Constant::SERVER_TYPE_BASE, Constant::SERVER_TYPE_TCP, {
Constant::SERVER_TYPE_UDP => Server::class, $config = created(Config::class, [], $port);
Constant::SERVER_TYPE_HTTP => HServer::class, if ($port['type'] == Constant::SERVER_TYPE_WEBSOCKET) {
Constant::SERVER_TYPE_WEBSOCKET => WServer::class, array_unshift($array, $config);
default => null } else if ($port['type'] == Constant::SERVER_TYPE_HTTP) {
}; if (!empty($array) && $array[0]['type'] == Constant::SERVER_TYPE_WEBSOCKET) {
} $array[] = $config;
} else {
array_unshift($array, $config);
}
} else {
$array[] = $config;
}
return $array;
}
/** /**
* @param $type * @param $type
* @return string|null * @return string|null
*/ */
public function getCoroutineServerClass($type): ?string public function getServerClass($type): ?string
{ {
return match ($type) { return match ($type) {
Constant::SERVER_TYPE_BASE, Constant::SERVER_TYPE_TCP, Constant::SERVER_TYPE_UDP => Coroutine\Server::class, Constant::SERVER_TYPE_BASE, Constant::SERVER_TYPE_TCP,
Constant::SERVER_TYPE_HTTP, Constant::SERVER_TYPE_WEBSOCKET => Coroutine\Http\Server::class, Constant::SERVER_TYPE_UDP => Server::class,
default => null Constant::SERVER_TYPE_HTTP => HServer::class,
}; Constant::SERVER_TYPE_WEBSOCKET => WServer::class,
} default => null
};
}
/**
* @param $type
* @return string|null
*/
public function getCoroutineServerClass($type): ?string
{
return match ($type) {
Constant::SERVER_TYPE_BASE, Constant::SERVER_TYPE_TCP, Constant::SERVER_TYPE_UDP => Coroutine\Server::class,
Constant::SERVER_TYPE_HTTP, Constant::SERVER_TYPE_WEBSOCKET => Coroutine\Http\Server::class,
default => null
};
}
} }
-1
View File
@@ -22,7 +22,6 @@ use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface; use Psr\Http\Message\UriInterface;
use Swoole\Http\Request; use Swoole\Http\Request;
use Swoole\Http\Response; use Swoole\Http\Response;
use Kiri\Di\Inject\Service;
use const Kiri\Router\ROUTER_TYPE_HTTP; use const Kiri\Router\ROUTER_TYPE_HTTP;
class OnRequest implements OnRequestInterface class OnRequest implements OnRequestInterface