This commit is contained in:
2021-07-21 18:56:05 +08:00
parent 68c8850922
commit 52fdb0e89c
2 changed files with 208 additions and 216 deletions
+1 -1
View File
@@ -93,7 +93,7 @@ class HTTPServerListener extends Abstracts\Server
public function onRequest(Request $request, Response $response) public function onRequest(Request $request, Response $response)
{ {
try { try {
// defer(fn() => fire(Event::SYSTEM_RESOURCE_RELEASES)); defer(fn() => fire(Event::SYSTEM_RESOURCE_RELEASES));
[$request, $_] = [HRequest::create($request), HResponse::create($response)]; [$request, $_] = [HRequest::create($request), HResponse::create($response)];
if ($request->is('favicon.ico')) { if ($request->is('favicon.ico')) {
+207 -215
View File
@@ -6,9 +6,7 @@ namespace Snowflake;
use Exception; use Exception;
use JetBrains\PhpStorm\Pure;
use Snowflake\Abstracts\BaseObject; use Snowflake\Abstracts\BaseObject;
use Snowflake\Core\ArrayAccess;
/** /**
* Class Event * Class Event
@@ -17,265 +15,259 @@ use Snowflake\Core\ArrayAccess;
class Event extends BaseObject class Event extends BaseObject
{ {
public bool $isVide = true; public bool $isVide = true;
private static array $_events = []; private static array $_events = [];
const PIPE_MESSAGE = 'SERVER:PIPE:MESSAGE'; const PIPE_MESSAGE = 'SERVER:PIPE:MESSAGE';
const TASK_FINISH = 'SERVER:TASK::FINISH'; const TASK_FINISH = 'SERVER:TASK::FINISH';
const EVENT_AFTER_REQUEST = 'SERVER:REQUEST:AFTER:START'; const EVENT_AFTER_REQUEST = 'SERVER:REQUEST:AFTER:START';
const EVENT_BEFORE_REQUEST = 'SERVER:REQUEST:BEFORE:START'; const EVENT_BEFORE_REQUEST = 'SERVER:REQUEST:BEFORE:START';
const RECEIVE_CONNECTION = 'SERVER:RECEIVE:CONNECTION'; const RECEIVE_CONNECTION = 'SERVER:RECEIVE:CONNECTION';
const SYSTEM_RESOURCE_RELEASES = 'SYSTEM::RESOURCE::RELEASES'; const SYSTEM_RESOURCE_RELEASES = 'SYSTEM::RESOURCE::RELEASES';
const SYSTEM_RESOURCE_CLEAN = 'SYSTEM::RESOURCE::CLEAN'; const SYSTEM_RESOURCE_CLEAN = 'SYSTEM::RESOURCE::CLEAN';
const PROCESS_WORKER_STOP = 'SERVER:PROCESS:WORKER:STOP'; const PROCESS_WORKER_STOP = 'SERVER:PROCESS:WORKER:STOP';
const SERVER_AFTER_RELOAD = 'SERVER:AFTER:RELOAD'; const SERVER_AFTER_RELOAD = 'SERVER:AFTER:RELOAD';
const SERVER_BEFORE_RELOAD = 'SERVER:BEFORE:RELOAD'; const SERVER_BEFORE_RELOAD = 'SERVER:BEFORE:RELOAD';
const SERVER_CONNECT = 'SERVER:CONNECT'; const SERVER_CONNECT = 'SERVER:CONNECT';
const SERVER_PACKAGE = 'SERVER:PACKAGE'; const SERVER_PACKAGE = 'SERVER:PACKAGE';
const SERVER_RECEIVE = 'SERVER:RECEIVE'; const SERVER_RECEIVE = 'SERVER:RECEIVE';
const SERVER_EVENT_START = 'SERVER:EVENT:START'; const SERVER_EVENT_START = 'SERVER:EVENT:START';
const SERVER_MANAGER_START = 'SERVER:EVENT:MANAGER:START'; const SERVER_MANAGER_START = 'SERVER:EVENT:MANAGER:START';
const SERVER_MANAGER_STOP = 'SERVER:EVENT:MANAGER:START'; const SERVER_MANAGER_STOP = 'SERVER:EVENT:MANAGER:START';
const SERVER_WORKER_STOP = 'SERVER:EVENT:WORKER:STOP'; const SERVER_WORKER_STOP = 'SERVER:EVENT:WORKER:STOP';
const SERVER_WORKER_START = 'SERVER:EVENT:WORKER:START'; const SERVER_WORKER_START = 'SERVER:EVENT:WORKER:START';
const SERVER_AFTER_WORKER_START = 'SERVER:EVENT:AFTER:WORKER:START'; const SERVER_AFTER_WORKER_START = 'SERVER:EVENT:AFTER:WORKER:START';
const SERVER_BEFORE_START = 'SERVER:EVENT:BEFORE:START'; const SERVER_BEFORE_START = 'SERVER:EVENT:BEFORE:START';
const BEFORE_COMMAND_EXECUTE = 'COMMAND:EVENT:BEFORE:EXECUTE'; const BEFORE_COMMAND_EXECUTE = 'COMMAND:EVENT:BEFORE:EXECUTE';
const AFTER_COMMAND_EXECUTE = 'COMMAND:EVENT:AFTER:EXECUTE'; const AFTER_COMMAND_EXECUTE = 'COMMAND:EVENT:AFTER:EXECUTE';
const SERVER_TASK_START = 'SERVER:EVENT:TASK:START'; const SERVER_TASK_START = 'SERVER:EVENT:TASK:START';
const SERVER_WORKER_EXIT = 'SERVER:EVENT:WORKER:EXIT'; const SERVER_WORKER_EXIT = 'SERVER:EVENT:WORKER:EXIT';
const SERVER_WORKER_ERROR = 'SERVER:EVENT:WORKER:ERROR'; const SERVER_WORKER_ERROR = 'SERVER:EVENT:WORKER:ERROR';
const SERVER_SHUTDOWN = 'SERVER:EVENT:SHUTDOWN'; const SERVER_SHUTDOWN = 'SERVER:EVENT:SHUTDOWN';
const SERVER_HANDSHAKE = 'on handshake'; const SERVER_HANDSHAKE = 'on handshake';
const SERVER_MESSAGE = 'on message'; const SERVER_MESSAGE = 'on message';
const SERVER_CLIENT_CLOSE = 'SERVER:CLIENT:CLOSE'; const SERVER_CLIENT_CLOSE = 'SERVER:CLIENT:CLOSE';
const SERVER_ON_START = 'Start'; const SERVER_ON_START = 'Start';
const SERVER_ON_SHUTDOWN = 'Shutdown'; const SERVER_ON_SHUTDOWN = 'Shutdown';
const SERVER_ON_WORKER_START = 'WorkerStart'; const SERVER_ON_WORKER_START = 'WorkerStart';
const SERVER_ON_WORKER_STOP = 'WorkerStop'; const SERVER_ON_WORKER_STOP = 'WorkerStop';
const SERVER_ON_WORKER_EXIT = 'WorkerExit'; const SERVER_ON_WORKER_EXIT = 'WorkerExit';
const SERVER_ON_CONNECT = 'Connect'; const SERVER_ON_CONNECT = 'Connect';
const SERVER_ON_RECEIVE = 'Receive'; const SERVER_ON_RECEIVE = 'Receive';
const SERVER_ON_PACKET = 'Packet'; const SERVER_ON_PACKET = 'Packet';
const SERVER_ON_REQUEST = 'request'; const SERVER_ON_REQUEST = 'request';
const SERVER_ON_CLOSE = 'Close'; const SERVER_ON_CLOSE = 'Close';
const SERVER_ON_TASK = 'Task'; const SERVER_ON_TASK = 'Task';
const SERVER_ON_FINISH = 'Finish'; const SERVER_ON_FINISH = 'Finish';
const SERVER_ON_PIPE_MESSAGE = 'PipeMessage'; const SERVER_ON_PIPE_MESSAGE = 'PipeMessage';
const SERVER_ON_WORKER_ERROR = 'WorkerError'; const SERVER_ON_WORKER_ERROR = 'WorkerError';
const SERVER_ON_MANAGER_START = 'ManagerStart'; const SERVER_ON_MANAGER_START = 'ManagerStart';
const SERVER_ON_MANAGER_STOP = 'ManagerStop'; const SERVER_ON_MANAGER_STOP = 'ManagerStop';
const SERVER_ON_BEFORE_RELOAD = 'BeforeReload'; const SERVER_ON_BEFORE_RELOAD = 'BeforeReload';
const SERVER_ON_AFTER_RELOAD = 'AfterReload'; const SERVER_ON_AFTER_RELOAD = 'AfterReload';
/** /**
* @param $name * @param $name
* @param $callback * @param $callback
* @param array $parameter * @param array $parameter
* @param bool $isAppend * @param bool $isAppend
* @throws Exception * @throws Exception
*/ */
public static function on($name, $callback, array $parameter = [], bool $isAppend = false) public static function on($name, $callback, array $parameter = [], bool $isAppend = false)
{ {
if (!isset(static::$_events[$name])) { if (!isset(static::$_events[$name])) {
static::$_events[$name] = []; static::$_events[$name] = [];
} }
if ($callback instanceof \Closure) { if ($callback instanceof \Closure) {
$callback = \Closure::bind($callback, Snowflake::app()); $callback = \Closure::bind($callback, Snowflake::app());
} else if (is_array($callback) && is_string($callback[0])) { } else if (is_array($callback) && is_string($callback[0])) {
if (!class_exists($callback[0])) { if (!class_exists($callback[0])) {
throw new Exception('Undefined callback class.'); throw new Exception('Undefined callback class.');
} }
$callback[0] = Snowflake::createObject($callback[0]); $callback[0] = Snowflake::createObject($callback[0]);
} }
if (static::exists($name, $callback)) { if (static::exists($name, $callback)) {
return; return;
} }
if (!empty(static::$_events[$name]) && $isAppend === true) { if (!empty(static::$_events[$name]) && $isAppend === true) {
array_unshift(static::$_events[$name], [$callback, $parameter]); array_unshift(static::$_events[$name], [$callback, $parameter]);
} else { } else {
static::$_events[$name][] = [$callback, $parameter]; static::$_events[$name][] = [$callback, $parameter];
} }
} }
/** /**
* @param $name * @param $name
* @param $callback * @param $callback
*/ */
public static function of($name, $callback): void public static function of($name, $callback): void
{ {
if (!isset(static::$_events[$name])) { if (!isset(static::$_events[$name])) {
return; return;
} }
foreach (static::$_events[$name] as $index => $event) { foreach (static::$_events[$name] as $index => $event) {
[$handler, $parameter] = $event; [$handler, $parameter] = $event;
if ($handler !== $callback) { if ($handler !== $callback) {
continue; continue;
} }
unset(static::$_events[$name][$index]); unset(static::$_events[$name][$index]);
} }
} }
/** /**
* @param $name * @param $name
* @return bool * @return bool
*/ */
public static function offName($name): bool public static function offName($name): bool
{ {
if (!static::exists($name)) { if (!static::exists($name)) {
return true; return true;
} }
unset(static::$_events[$name]); unset(static::$_events[$name]);
return static::exists($name); return static::exists($name);
} }
/** /**
* @param $name * @param $name
* @param null $callback * @param null $callback
* @return bool * @return bool
*/ */
public static function exists($name, $callback = null): bool public static function exists($name, $callback = null): bool
{ {
if (!isset(static::$_events[$name])) { if (!isset(static::$_events[$name])) {
return false; return false;
} }
if ($callback === null) { if ($callback === null) {
return true; return true;
} }
foreach (static::$_events[$name] as $event) { foreach (static::$_events[$name] as $event) {
[$handler, $parameter] = $event; [$handler, $parameter] = $event;
if ($handler === $callback) { if ($handler === $callback) {
return true; return true;
} }
} }
return false; return false;
} }
/** /**
* @param $name * @param $name
* @param $handler * @param $handler
* @return mixed * @return mixed
*/ */
public static function get($name, $handler): mixed public static function get($name, $handler): mixed
{ {
if (!static::exists($name, $handler)) { if (!static::exists($name, $handler)) {
return null; return null;
} }
if (empty($handler)) { if (empty($handler)) {
return static::$_events[$name]; return static::$_events[$name];
} }
foreach (static::$_events[$name] as $event) { foreach (static::$_events[$name] as $event) {
[$callback, $parameter] = $event; [$callback, $parameter] = $event;
if ($callback === $handler) { if ($callback === $handler) {
return [$event]; return [$event];
} }
} }
return null; return null;
} }
public static function clean() public static function clean()
{ {
static::$_events = []; static::$_events = [];
} }
/** /**
* @param $name * @param $name
* @param array $params * @param array $params
* @param null $scope
* @return bool * @return bool
* @throws Exception * @throws Exception
*/ */
public function dispatch($name, array $params = [], $scope = null): bool public function dispatch($name, array $params = []): bool
{ {
return static::trigger($name, $params, $scope); return static::trigger($name, $params);
} }
/** /**
* @param $name * @param $name
* @param null $parameter * @param null $parameter
* @param null $handler
* @param false $is_remove * @param false $is_remove
* @return bool * @return bool
* @throws Exception * @throws Exception
*/ */
public static function trigger($name, $parameter = null, $handler = null, bool $is_remove = false): bool public static function trigger($name, $parameter = null, bool $is_remove = false): bool
{ {
$events = static::get($name, $handler); foreach ((static::$_events[$name] ?? []) as $event) {
if (empty($events)) { static::execute($event, $parameter);
return true; }
} if ($is_remove) {
foreach ($events as $event) { static::offName($name);
static::execute($event, $parameter); }
} return true;
if ($is_remove) { }
static::offName($name);
}
return true;
}
/** /**
* @param $event * @param $event
* @param $parameter * @param $parameter
* @return bool * @return bool
* @throws Exception * @throws Exception
*/ */
private static function execute($event, $parameter): bool private static function execute($event, $parameter): bool
{ {
try { try {
$meta = static::mergeParams($event[1], $parameter); $meta = static::mergeParams($event[1], $parameter);
if (call_user_func($event[0], ...$meta) === false) { if (call_user_func($event[0], ...$meta) === false) {
return false; return false;
} }
return true; return true;
} catch (\Throwable $throwable) { } catch (\Throwable $throwable) {
return logger()->addError($throwable,'throwable'); return logger()->addError($throwable, 'throwable');
} }
} }
/** /**
* @param $defaultParameter * @param $defaultParameter
* @param array $parameter * @param array $parameter
* @return array * @return array
*/ */
private static function mergeParams($defaultParameter, array $parameter = []): array private static function mergeParams($defaultParameter, array $parameter = []): array
{ {
if (empty($defaultParameter)) { if (empty($defaultParameter)) {
$defaultParameter = $parameter; $defaultParameter = $parameter;
} else { } else {
if (!is_array($parameter)) { if (!is_array($parameter)) {
$parameter = []; $parameter = [];
} }
foreach ($parameter as $key => $value) { foreach ($parameter as $key => $value) {
$defaultParameter[] = $value; $defaultParameter[] = $value;
} }
} }
if (!is_array($defaultParameter)) { if (!is_array($defaultParameter)) {
$defaultParameter = [$defaultParameter]; $defaultParameter = [$defaultParameter];
} }
return $defaultParameter; return $defaultParameter;
} }
} }