inject container into framework

This commit is contained in:
sunxyw
2022-04-10 00:58:07 +08:00
parent e37629aaea
commit 721c0834db
7 changed files with 244 additions and 118 deletions

View File

@@ -5,15 +5,18 @@ declare(strict_types=1);
namespace ZM\Event\SwooleEvent;
use Swoole\Coroutine;
use Swoole\Http\Server;
use Swoole\WebSocket\Frame;
use Throwable;
use ZM\Annotation\Swoole\OnMessageEvent;
use ZM\Annotation\Swoole\OnSwooleEvent;
use ZM\Annotation\Swoole\SwooleHandler;
use ZM\ConnectionManager\ConnectionObject;
use ZM\ConnectionManager\ManagerGM;
use ZM\Console\Console;
use ZM\Console\TermColor;
use ZM\Context\Context;
use ZM\Context\ContextInterface;
use ZM\Event\EventDispatcher;
use ZM\Event\SwooleEvent;
@@ -29,6 +32,15 @@ class OnMessage implements SwooleEvent
unset(Context::$context[Coroutine::getCid()]);
$conn = ManagerGM::get($frame->fd);
set_coroutine_params(['server' => $server, 'frame' => $frame, 'connection' => $conn]);
container()->instance(Server::class, $server);
container()->instance(Frame::class, $frame);
container()->instance(ConnectionObject::class, $conn);
container()->bind(ContextInterface::class, function () {
return ctx();
});
container()->alias(ContextInterface::class, Context::class);
$dispatcher1 = new EventDispatcher(OnMessageEvent::class);
$dispatcher1->setRuleFunction(function ($v) use ($conn) {
return $v->connect_type === $conn->getName() && ($v->getRule() === '' || eval('return ' . $v->getRule() . ';'));
@@ -56,6 +68,11 @@ class OnMessage implements SwooleEvent
$error_msg = $e->getMessage() . ' at ' . $e->getFile() . '(' . $e->getLine() . ')';
Console::error(zm_internal_errcode('E00017') . 'Uncaught ' . get_class($e) . ' when calling "message": ' . $error_msg);
Console::trace();
} finally {
container()->flush();
if (Console::getLevel() >= 4) {
Console::debug(sprintf('Request container [fd=%d, cid=%d] flushed.', $frame->fd, Coroutine::getCid()));
}
}
}
}

View File

@@ -20,6 +20,7 @@ use ZM\Annotation\Swoole\OnStart;
use ZM\Annotation\Swoole\SwooleHandler;
use ZM\Config\ZMConfig;
use ZM\Console\Console;
use ZM\Container\WorkerContainer;
use ZM\Context\Context;
use ZM\Context\ContextInterface;
use ZM\DB\DB;
@@ -52,6 +53,13 @@ class OnWorkerStart implements SwooleEvent
SignalListener::signalWorker($server, $worker_id);
}
unset(Context::$context[Coroutine::getCid()]);
/* @noinspection PhpExpressionResultUnusedInspection */
new WorkerContainer();
if (Console::getLevel() >= 4) {
Console::debug(sprintf('Worker container [id=%d,cid=%d] booted', $worker_id, Coroutine::getCid()));
}
if ($server->taskworker === false) {
Framework::saveProcessState(ZM_PROCESS_WORKER, $server->worker_pid, ['worker_id' => $worker_id]);
zm_atomic('_#worker_' . $worker_id)->set($server->worker_pid);
@@ -274,7 +282,7 @@ class OnWorkerStart implements SwooleEvent
(new PDOConfig())
->withHost($real_conf['host'])
->withPort($real_conf['port'])
// ->withUnixSocket('/tmp/mysql.sock')
// ->withUnixSocket('/tmp/mysql.sock')
->withDbName($real_conf['dbname'])
->withCharset($real_conf['charset'])
->withUsername($real_conf['username'])

View File

@@ -8,6 +8,7 @@ use Swoole\Server;
use ZM\Annotation\Swoole\SwooleHandler;
use ZM\Config\ZMConfig;
use ZM\Console\Console;
use ZM\Container\WorkerContainer;
use ZM\Event\SwooleEvent;
use ZM\Framework;
use ZM\Store\LightCache;
@@ -20,6 +21,11 @@ class OnWorkerStop implements SwooleEvent
{
public function onCall(Server $server, $worker_id)
{
WorkerContainer::getInstance()->flush();
if (Console::getLevel() >= 4) {
Console::debug(sprintf('Worker container [id=%d] flushed', $worker_id));
}
if ($worker_id == (ZMConfig::get('worker_cache')['worker'] ?? 0)) {
LightCache::savePersistence();
}