From 5fa97ded9396ce4e70c4dc2ac6238c6b0545340a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mr=C2=B7x?= Date: Wed, 2 Sep 2020 17:33:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- http-server/Abstracts/Callback.php | 44 +++++++++++++++++++- http-server/Events/OnAfterReload.php | 22 +++++++++- http-server/Events/OnBeforeReload.php | 20 ++++++++- http-server/Events/OnShutdown.php | 52 ++++-------------------- http-server/Events/OnWorkerError.php | 26 ++++++++++-- http-server/Events/OnWorkerExit.php | 7 +++- http-server/Server.php | 29 +++++++++---- http-server/Service/Abstracts/Server.php | 7 ++-- http-server/Service/Receive.php | 4 -- system/Event.php | 4 ++ 10 files changed, 147 insertions(+), 68 deletions(-) diff --git a/http-server/Abstracts/Callback.php b/http-server/Abstracts/Callback.php index 848a35f1..c9336e97 100644 --- a/http-server/Abstracts/Callback.php +++ b/http-server/Abstracts/Callback.php @@ -6,6 +6,8 @@ namespace HttpServer\Events\Abstracts; use Exception; use HttpServer\Application; +use PHPMailer\PHPMailer\PHPMailer; +use PHPMailer\PHPMailer\SMTP; use Snowflake\Error\Logger; use Snowflake\Event; use Snowflake\Snowflake; @@ -38,7 +40,6 @@ abstract class Callback extends Application } - const EVENT_ERROR = 'WORKER:ERROR'; const EVENT_STOP = 'WORKER:STOP'; const EVENT_EXIT = 'WORKER:EXIT'; @@ -78,4 +79,45 @@ abstract class Callback extends Application } } + + /** + * @param $email + * @param $nickname + * @param $message + * @throws + */ + protected function system_mail($email, $nickname, $message) + { + $mail = new PHPMailer(true); + try { + //Server settings + $mail->SMTPDebug = SMTP::DEBUG_SERVER; // Enable verbose debug output + $mail->isSMTP(); // Send using SMTP + $mail->Host = 'smtp1.example.com'; // Set the SMTP server to send through + $mail->SMTPAuth = true; // Enable SMTP authentication + $mail->Username = 'user@example.com'; // SMTP username + $mail->Password = 'secret'; // SMTP password + $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` encouraged + $mail->Port = 587; // TCP port to connect to, use 465 for `PHPMailer::ENCRYPTION_SMTPS` above + + //Recipients + $mail->setFrom('system@example.com', '系统管理员'); + $mail->addAddress($email, $nickname); // Add a recipient + + // Attachments +// $mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments +// $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name + + // Content + $mail->isHTML(true); // Set email format to HTML + $mail->Subject = 'Here is the subject'; + $mail->Body = $message; + $mail->AltBody = $message; + + $mail->send(); + } catch (Exception $e) { + $this->addError($e->getMessage(),'email'); + } + } + } diff --git a/http-server/Events/OnAfterReload.php b/http-server/Events/OnAfterReload.php index 38ce2e0c..2efd67f9 100644 --- a/http-server/Events/OnAfterReload.php +++ b/http-server/Events/OnAfterReload.php @@ -4,15 +4,33 @@ namespace HttpServer\Events; +use Exception; use HttpServer\Events\Abstracts\Callback; +use Snowflake\Event; +use Snowflake\Exception\ComponentException; +use Snowflake\Snowflake; +use Swoole\Server; +/** + * Class OnAfterReload + * @package HttpServer\Events + */ class OnAfterReload extends Callback { - public function onHandler() + /** + * @param Server $server + * @throws ComponentException + * @throws Exception + */ + public function onHandler(Server $server) { - // TODO: Implement onHandler() method. + $event = Snowflake::get()->getEvent(); + if (!$event->exists(Event::SERVER_AFTER_RELOAD)) { + return; + } + $event->trigger(Event::SERVER_AFTER_RELOAD, [$server]); } } diff --git a/http-server/Events/OnBeforeReload.php b/http-server/Events/OnBeforeReload.php index bcad3a02..f41cf7ef 100644 --- a/http-server/Events/OnBeforeReload.php +++ b/http-server/Events/OnBeforeReload.php @@ -4,14 +4,30 @@ namespace HttpServer\Events; +use Exception; use HttpServer\Events\Abstracts\Callback; +use Snowflake\Event; +use Snowflake\Snowflake; +use Swoole\Server; +/** + * Class OnBeforeReload + * @package HttpServer\Events + */ class OnBeforeReload extends Callback { - public function onHandler() + /** + * @param Server $server + * @throws Exception + */ + public function onHandler(Server $server) { - // TODO: Implement onHandler() method. + $event = Snowflake::get()->getEvent(); + if (!$event->exists(Event::SERVER_BEFORE_RELOAD)) { + return; + } + $event->trigger(Event::SERVER_BEFORE_RELOAD, [$server]); } } diff --git a/http-server/Events/OnShutdown.php b/http-server/Events/OnShutdown.php index 8ee61e84..130b57a8 100644 --- a/http-server/Events/OnShutdown.php +++ b/http-server/Events/OnShutdown.php @@ -12,6 +12,7 @@ use Snowflake\Config; use Snowflake\Core\JSON; use Snowflake\Error\Logger; use Snowflake\Event; +use Snowflake\Exception\ComponentException; use Snowflake\Exception\ConfigException; use Snowflake\Snowflake; use Swoole\Server; @@ -26,55 +27,18 @@ class OnShutdown extends Callback /** * @param Server $server - * @throws ConfigException + * @throws ConfigException|ComponentException + * @throws Exception */ public function onHandler(Server $server) { - $email = Config::get('email'); - $nickname = Config::get('nickname'); + $this->system_mail(Config::get('email'), Config::get('nickname'), 'server shutdown~'); - $this->system_mail($email, $nickname); - } - - - /** - * @param $email - * @param $nickname - */ - protected function system_mail($email, $nickname) - { - try { - $mail = new PHPMailer(true); - //Server settings - $mail->SMTPDebug = SMTP::DEBUG_SERVER; // Enable verbose debug output - $mail->isSMTP(); // Send using SMTP - $mail->Host = 'smtp1.example.com'; // Set the SMTP server to send through - $mail->SMTPAuth = true; // Enable SMTP authentication - $mail->Username = 'user@example.com'; // SMTP username - $mail->Password = 'secret'; // SMTP password - $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` encouraged - $mail->Port = 587; // TCP port to connect to, use 465 for `PHPMailer::ENCRYPTION_SMTPS` above - - //Recipients - $mail->setFrom('system@example.com', '系统管理员'); - $mail->addAddress($email, $nickname); // Add a recipient - - // Attachments -// $mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments -// $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name - - // Content - $mail->isHTML(true); // Set email format to HTML - $mail->Subject = 'Here is the subject'; - $mail->Body = 'This is the HTML message body in bold!'; - $mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; - - $mail->send(); - echo 'Message has been sent'; - } catch (Exception $e) { - echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; + $event = Snowflake::get()->getEvent(); + if (!$event->exists(Event::SERVER_SHUTDOWN)) { + return; } + $event->trigger(Event::SERVER_SHUTDOWN); } - } diff --git a/http-server/Events/OnWorkerError.php b/http-server/Events/OnWorkerError.php index e9ef9f1c..661f2b60 100644 --- a/http-server/Events/OnWorkerError.php +++ b/http-server/Events/OnWorkerError.php @@ -4,19 +4,37 @@ namespace HttpServer\Events; +use Exception; use HttpServer\Events\Abstracts\Callback; +use Snowflake\Config; +use Snowflake\Exception\ConfigException; +use Swoole\Server; class OnWorkerError extends Callback { /** - * @param $server - * @param $worker_id - * @throws \Exception + * @param Server $server + * @param int $worker_id + * @param int $worker_pid + * @param int $exit_code + * @param int $signal + * @throws ConfigException */ - public function onHandler($server, $worker_id) + public function onHandler(Server $server, int $worker_id, int $worker_pid, int $exit_code, int $signal) { $this->clear($server, $worker_id, self::EVENT_ERROR); + if (!Config::has('email')) { + return; + } + $email = Config::get('email'); + $name = Config::get('nickname', false, 'Admin'); + $this->system_mail($email, $name, print_r([ + '$worker_pid' => $worker_pid, + '$worker_id' => $worker_id, + '$exit_code' => $exit_code, + '$signal' => $signal, + ], true)); } } diff --git a/http-server/Events/OnWorkerExit.php b/http-server/Events/OnWorkerExit.php index 267c5424..9ed807f7 100644 --- a/http-server/Events/OnWorkerExit.php +++ b/http-server/Events/OnWorkerExit.php @@ -4,15 +4,20 @@ namespace HttpServer\Events; +use Exception; use HttpServer\Events\Abstracts\Callback; +/** + * Class OnWorkerExit + * @package HttpServer\Events + */ class OnWorkerExit extends Callback { /** * @param $server * @param $worker_id - * @throws \Exception + * @throws Exception */ public function onHandler($server, $worker_id) { diff --git a/http-server/Server.php b/http-server/Server.php index 2e30c5d0..60cb0f9f 100644 --- a/http-server/Server.php +++ b/http-server/Server.php @@ -175,8 +175,8 @@ class Server extends Application } } else { $newListener = $this->baseServer->addlistener($config['host'], $config['port'], $config['mode']); - if (!empty($settings)) { - $newListener->set($settings); + if (isset($config['settings']) && is_array($config['settings'])) { + $newListener->set($config['settings']); } $this->onListenerBind($config, $this->baseServer, $event); } @@ -196,15 +196,15 @@ class Server extends Application { $this->debug(sprintf('Listener %s::%d', $config['host'], $config['port'])); if ($config['type'] == self::HTTP) { - $newListener->on('request', [Snowflake::createObject(OnRequest::class), 'onHandler']); + $this->onBind($newListener, 'request', [Snowflake::createObject(OnRequest::class), 'onHandler']); if (!$event->exists(Event::SERVER_WORKER_START, [$this, 'onLoadHttpHandler'])) { $event->on(Event::SERVER_WORKER_START, [$this, 'onLoadHttpHandler']); } } else if ($config['type'] == self::TCP || $config['type'] == self::PACKAGE) { - $newListener->on('connect', [Snowflake::createObject(OnConnect::class), 'onHandler']); - $newListener->on('close', [Snowflake::createObject(OnClose::class), 'onHandler']); - $newListener->on('packet', [Snowflake::createObject(OnPacket::class), 'onHandler']); - $newListener->on('receive', [Snowflake::createObject(OnReceive::class), 'onHandler']); + $this->onBind($newListener, 'connect', [Snowflake::createObject(OnConnect::class), 'onHandler']); + $this->onBind($newListener, 'close', [Snowflake::createObject(OnClose::class), 'onHandler']); + $this->onBind($newListener, 'packet', [Snowflake::createObject(OnPacket::class), 'onHandler']); + $this->onBind($newListener, 'receive', [Snowflake::createObject(OnReceive::class), 'onHandler']); } else if ($config['type'] == self::WEBSOCKET) { throw new Exception('Base server must instanceof \Swoole\WebSocket\Server::class.'); } else { @@ -213,6 +213,21 @@ class Server extends Application } + /** + * @param $server + * @param $name + * @param $callback + */ + private function onBind($server, $name, $callback) + { + if (in_array($name, $this->listening)) { + return; + } + $this->listening[] = $name; + $server->on($name, $callback); + } + + /** * Load router handler */ diff --git a/http-server/Service/Abstracts/Server.php b/http-server/Service/Abstracts/Server.php index 330c8e40..650bf16e 100644 --- a/http-server/Service/Abstracts/Server.php +++ b/http-server/Service/Abstracts/Server.php @@ -49,14 +49,15 @@ trait Server */ public function onHandlerListener() { - $this->on('start', $this->createHandler('start')); - $this->on('shutdown', $this->createHandler('shutdown')); $this->on('workerStop', $this->createHandler('workerStop')); $this->on('workerExit', $this->createHandler('workerExit')); $this->on('workerStart', $this->createHandler('workerStart')); $this->on('workerError', $this->createHandler('workerError')); - $this->on('managerStop', $this->createHandler('managerStop')); $this->on('managerStart', $this->createHandler('managerStart')); + $this->on('managerStop', $this->createHandler('managerStop')); + $this->on('pipeMessage', $this->createHandler('pipeMessage')); + $this->on('shutdown', $this->createHandler('shutdown')); + $this->on('start', $this->createHandler('start')); $this->addTask(); } diff --git a/http-server/Service/Receive.php b/http-server/Service/Receive.php index 4185627a..ebdb8863 100644 --- a/http-server/Service/Receive.php +++ b/http-server/Service/Receive.php @@ -4,13 +4,9 @@ namespace HttpServer\Service; -use Exception; use HttpServer\Service\Abstracts\Tcp; use ReflectionException; -use Snowflake\Event; use Snowflake\Exception\NotFindClassException; -use Snowflake\Snowflake; -use Swoole\Server; /** * Class Receive diff --git a/system/Event.php b/system/Event.php index 541d06e8..f58713e9 100644 --- a/system/Event.php +++ b/system/Event.php @@ -33,6 +33,9 @@ class Event extends BaseObject const RELEASE_ALL = 'SERVER:RELEASE:ALL'; + const SERVER_AFTER_RELOAD = 'SERVER:AFTER:RELOAD'; + const SERVER_BEFORE_RELOAD = 'SERVER:BEFORE:RELOAD'; + const SERVER_EVENT_START = 'SERVER:EVENT:START'; const SERVER_MANAGER_START = 'SERVER:EVENT:MANAGER:START'; const SERVER_MANAGER_STOP = 'SERVER:EVENT:MANAGER:START'; @@ -40,6 +43,7 @@ class Event extends BaseObject const SERVER_WORKER_START = 'SERVER:EVENT:WORKER:START'; const SERVER_WORKER_EXIT = 'SERVER:EVENT:WORKER:EXIT'; const SERVER_WORKER_ERROR = 'SERVER:EVENT:WORKER:ERROR'; + const SERVER_SHUTDOWN = 'SERVER:EVENT:SHUTDOWN'; const SERVER_HANDSHAKE = 'on handshake'; const SERVER_MESSAGE = 'on message';