From b560246efb71b28b4e554bfae54a3df36495d4fa Mon Sep 17 00:00:00 2001 From: whale Date: Tue, 14 Apr 2020 23:46:42 +0800 Subject: [PATCH] add context() fetch data mode enable coroutine override --- src/Framework/FrameworkLoader.php | 4 +++- src/Framework/global_functions.php | 28 +++++++++++++++++------- src/ZM/Event/EventHandler.php | 3 +++ src/ZM/Event/Swoole/MessageEvent.php | 8 ++++--- src/ZM/Event/Swoole/WSCloseEvent.php | 3 ++- src/ZM/Event/Swoole/WSOpenEvent.php | 3 ++- src/ZM/Event/Swoole/WorkerStartEvent.php | 3 ++- src/ZM/Http/Response.php | 6 +++++ 8 files changed, 43 insertions(+), 15 deletions(-) diff --git a/src/Framework/FrameworkLoader.php b/src/Framework/FrameworkLoader.php index 47bc026d..54334dca 100644 --- a/src/Framework/FrameworkLoader.php +++ b/src/Framework/FrameworkLoader.php @@ -3,6 +3,7 @@ namespace Framework; +use Swoole\Runtime; use ZM\Event\EventHandler; use Exception; use Swoole\WebSocket\Server; @@ -38,6 +39,7 @@ class FrameworkLoader chdir(__DIR__ . '/../..'); define('WORKING_DIR', getcwd()); + Runtime::enableCoroutine(); $this->requireGlobalFunctions(); $this->registerAutoloader('classLoader'); self::$settings = new GlobalConfig(); @@ -108,4 +110,4 @@ class FrameworkLoader self::$run_time = microtime(true); EventHandler::callSwooleEvent("WorkerStart", $server, $worker_id); } -} \ No newline at end of file +} diff --git a/src/Framework/global_functions.php b/src/Framework/global_functions.php index 09c1609e..98c1176c 100644 --- a/src/Framework/global_functions.php +++ b/src/Framework/global_functions.php @@ -1,5 +1,6 @@ $v) { - if(!Co::exists($c)) unset(ZMBuf::$context[$c]); + foreach (ZMBuf::$context as $c => $v) { + if (!Co::exists($c)) unset(ZMBuf::$context[$c]); } } -function context(){ +function context() { $cid = Co::getCid(); - if(isset(ZMBuf::$context[$cid])) { + if (isset(ZMBuf::$context[$cid])) { return new Context(ZMBuf::$context[$cid], $cid); - } else return null; + } else { + while (($pcid = Co::getPcid($cid)) !== -1) { + if (isset(ZMBuf::$context[$cid])) return new Context(ZMBuf::$context[$cid], $cid); + else $cid = $pcid; + } + return null; + } +} + +function debug($msg) { + if (ZMBuf::$atomics["info_level"]->get() == 1) + Console::log(date("[H:i:s ") . "DEBUG] " . $msg, 'gray'); } diff --git a/src/ZM/Event/EventHandler.php b/src/ZM/Event/EventHandler.php index 63f5d493..559222d7 100644 --- a/src/ZM/Event/EventHandler.php +++ b/src/ZM/Event/EventHandler.php @@ -43,6 +43,9 @@ class EventHandler } catch (Exception $e) { /** @var Response $param1 */ $param1->status(500); + Console::info($param0->server["remote_addr"].":".$param0->server["remote_port"]. + " [".$param1->getStatusCode()."] ".$param0->server["request_uri"] + ); if (!$param1->isEnd()) $param1->end("Internal server error: " . $e->getMessage()); Console::error("Internal server error (500), caused by uncaught exception."); Console::log($e->getTraceAsString(), "gray"); diff --git a/src/ZM/Event/Swoole/MessageEvent.php b/src/ZM/Event/Swoole/MessageEvent.php index bba48462..6739a310 100644 --- a/src/ZM/Event/Swoole/MessageEvent.php +++ b/src/ZM/Event/Swoole/MessageEvent.php @@ -39,17 +39,19 @@ class MessageEvent implements SwooleEvent */ public function onActivate() { ZMUtil::checkWait(); + $conn = ConnectionManager::get($this->frame->fd); + set_coroutine_params(["server" => $this->server, "frame" => $this->frame, "connection" => $conn]); try { - if (ConnectionManager::get($this->frame->fd)->getType() == "qq") { + if ($conn->getType() == "qq") { $data = json_decode($this->frame->data, true); if (isset($data["post_type"])) { + set_coroutine_params(["data" => $data, "connection" => $conn]); EventHandler::callCQEvent($data, ConnectionManager::get($this->frame->fd), 0); } else EventHandler::callCQResponse($data); } foreach (ZMBuf::$events[SwooleEventAt::class] ?? [] as $v) { if (strtolower($v->type) == "message" && $this->parseSwooleRule($v)) { - $conn = ConnectionManager::get($this->frame->fd); $c = $v->class; /** @var ModBase $class */ $class = new $c(["server" => $this->server, "frame" => $this->frame, "connection" => $conn], ModHandleType::SWOOLE_MESSAGE); @@ -91,4 +93,4 @@ class MessageEvent implements SwooleEvent } return true; } -} \ No newline at end of file +} diff --git a/src/ZM/Event/Swoole/WSCloseEvent.php b/src/ZM/Event/Swoole/WSCloseEvent.php index 65be3386..eb17f491 100644 --- a/src/ZM/Event/Swoole/WSCloseEvent.php +++ b/src/ZM/Event/Swoole/WSCloseEvent.php @@ -30,6 +30,7 @@ class WSCloseEvent implements SwooleEvent public function onActivate() { ZMUtil::checkWait(); ConnectionManager::close($this->fd); + set_coroutine_params(["server" => $this->server, "fd" => $this->fd]); foreach(ZMBuf::$events[SwooleEventAt::class] ?? [] as $v) { if(strtolower($v->type) == "close" && $this->parseSwooleRule($v)) { $c = $v->class; @@ -60,4 +61,4 @@ class WSCloseEvent implements SwooleEvent private function parseSwooleRule($v) { return true; } -} \ No newline at end of file +} diff --git a/src/ZM/Event/Swoole/WSOpenEvent.php b/src/ZM/Event/Swoole/WSOpenEvent.php index af6ef95b..936c62a3 100644 --- a/src/ZM/Event/Swoole/WSOpenEvent.php +++ b/src/ZM/Event/Swoole/WSOpenEvent.php @@ -55,6 +55,7 @@ class WSOpenEvent implements SwooleEvent $this->conn = new $type_conn($this->server, $this->request->fd); } ZMBuf::$connect[$this->request->fd] = $this->conn; + set_coroutine_params(["server" => $this->server, "request" => $this->request, "connection" => $this->conn]); foreach (ZMBuf::$events[SwooleEventAt::class] ?? [] as $v) { if (strtolower($v->type) == "open" && $this->parseSwooleRule($v) === true) { $c = $v->class; @@ -90,4 +91,4 @@ class WSOpenEvent implements SwooleEvent } return true; } -} \ No newline at end of file +} diff --git a/src/ZM/Event/Swoole/WorkerStartEvent.php b/src/ZM/Event/Swoole/WorkerStartEvent.php index c8b23c5c..4f535954 100644 --- a/src/ZM/Event/Swoole/WorkerStartEvent.php +++ b/src/ZM/Event/Swoole/WorkerStartEvent.php @@ -94,6 +94,7 @@ class WorkerStartEvent implements SwooleEvent $class = new $class_name(["server" => $this->server, "worker_id" => $this->worker_id], ModHandleType::SWOOLE_WORKER_START); call_user_func_array([$class, $v->method], []); } + set_coroutine_params(["server" => $this->server, "worker_id" => $this->worker_id]); foreach (ZMBuf::$events[SwooleEventAfter::class] ?? [] as $v) { /** @var AnnotationBase $v */ if (strtolower($v->type) == "workerstart") { @@ -156,4 +157,4 @@ class WorkerStartEvent implements SwooleEvent DataProvider::saveBuffer(); }); } -} \ No newline at end of file +} diff --git a/src/ZM/Http/Response.php b/src/ZM/Http/Response.php index 39dd623d..2c937f89 100644 --- a/src/ZM/Http/Response.php +++ b/src/ZM/Http/Response.php @@ -21,6 +21,7 @@ class Response */ private $response; private $is_end = false; + private $status_code; public function __construct(\Swoole\Http\Response $response) { $this->response = $response; @@ -90,9 +91,14 @@ class Response * @return mixed */ public function status($http_code, $reason = null) { + $this->status_code = $http_code; return $this->response->status($http_code, $reason); } + public function getStatusCode() { + return $this->status_code ?? 200; + } + /** * @param $http_code * @param $reason