orgianze bootstrapper

This commit is contained in:
sunxyw
2022-11-08 17:28:07 +08:00
parent 74ba4d0145
commit aa29dc99f3
9 changed files with 210 additions and 93 deletions

View File

@@ -0,0 +1,35 @@
<?php
namespace ZM\Bootstrap;
use OneBot\Driver\ExceptionHandler;
use ZM\Exception\Handler;
class HandleExceptions
{
public function bootstrap(array $config): void
{
// 注册全局错误处理器
set_error_handler(function ($error_no, $error_msg, $error_file, $error_line) {
$tips = [
E_WARNING => ['PHP Warning: ', 'warning'],
E_NOTICE => ['PHP Notice: ', 'notice'],
E_USER_ERROR => ['PHP Error: ', 'error'],
E_USER_WARNING => ['PHP Warning: ', 'warning'],
E_USER_NOTICE => ['PHP Notice: ', 'notice'],
E_STRICT => ['PHP Strict: ', 'notice'],
E_RECOVERABLE_ERROR => ['PHP Recoverable Error: ', 'error'],
E_DEPRECATED => ['PHP Deprecated: ', 'notice'],
E_USER_DEPRECATED => ['PHP User Deprecated: ', 'notice'],
];
$level_tip = $tips[$error_no] ?? ['PHP Unknown: ', 'error'];
$error = $level_tip[0] . $error_msg . ' in ' . $error_file . ' on ' . $error_line;
logger()->{$level_tip[1]}($error);
// 如果 return false 则错误会继续递交给 PHP 标准错误处理
return true;
}, E_ALL | E_STRICT);
// 重载异常处理器
ExceptionHandler::getInstance()->overrideWith(new Handler());
}
}

View File

@@ -0,0 +1,69 @@
<?php
namespace ZM\Bootstrap;
use OneBot\Driver\Workerman\Worker;
use ZM\Config\ZMConfig;
class LoadConfiguration
{
public function bootstrap(array $config): void
{
$config_i = config();
$config_i->addConfigPath($this->getConfigDir($config));
$config_i->setEnvironment($this->getConfigEnvironment($config));
$this->parseArgvToConfig($config, $config_i);
}
private function getConfigDir(array $config): string
{
$config_dir = $config['config-dir'];
// 默认配置文件目录
$find_dir = [
WORKING_DIR . '/config',
SOURCE_ROOT_DIR . '/config',
];
// 如果启动参数指定了配置文件目录,则优先使用
if ($config_dir !== null) {
array_unshift($find_dir, $config_dir);
}
// 遍历目录,找到第一个存在的目录
foreach ($find_dir as $dir) {
if (is_dir($dir)) {
return $dir;
}
}
// 如果没有找到目录,则抛出异常
throw new \RuntimeException('No config directory found');
}
private function getConfigEnvironment(array $config): string
{
return $config['env'] ?? 'development';
}
private function parseArgvToConfig(array $argv, ZMConfig $config): void
{
foreach ($argv as $x => $y) {
// 当值为 true/false 时,表示该参数为可选参数。当值为 null 时,表示该参数必定会有一个值,如果是 null说明没指定
if ($y === false || is_null($y)) {
continue;
}
switch ($x) {
case 'driver': // 动态设置驱动类型
$config->set('global.driver', $y);
break;
case 'worker-num': // 动态设置 Worker 数量
$config->set('global.swoole_options.swoole_set.worker_num', (int)$y);
$config->set('global.workerman_options.workerman_worker_num', (int)$y);
break;
case 'daemon': // 启动为守护进程
$config->set('global.swoole_options.swoole_set.daemonize', 1);
Worker::$daemonize = true;
break;
}
}
}
}

View File

@@ -0,0 +1,11 @@
<?php
namespace ZM\Bootstrap;
class LoadGlobalDefines
{
public function bootstrap(array $config): void
{
require zm_dir(SOURCE_ROOT_DIR . '/src/Globals/global_defines_framework.php');
}
}

View File

@@ -0,0 +1,14 @@
<?php
namespace ZM\Bootstrap;
use ZM\Event\EventProvider;
class RegisterEventProvider
{
public function bootstrap(array $config): void
{
global $ob_event_provider;
$ob_event_provider = EventProvider::getInstance();
}
}

View File

@@ -0,0 +1,18 @@
<?php
namespace ZM\Bootstrap;
use ZM\Logger\ConsoleLogger;
class RegisterLogger
{
public function bootstrap(array $config): void
{
// 初始化 Logger
if (!ob_logger_registered()) {
// 如果没有注册过 Logger那么就初始化一个在启动框架前注册的话就不会初始化了可替换为其他 Logger
$logger = new ConsoleLogger($config['log-level'] ?? 'info');
ob_logger_register($logger);
}
}
}

View File

@@ -0,0 +1,11 @@
<?php
namespace ZM\Bootstrap;
class SetInternalTimezone
{
public function bootstrap(array $config): void
{
date_default_timezone_set(config('global.runtime.timezone', 'UTC'));
}
}