043306819b
- 添加基础配置文件,包括app、autoload、bootstrap、container、database、dependence、exception、log、middleware - 新增完整Dockerfile和docker-compose.yml,支持容器化运行 - 增加webman控制台插件配置及依赖管理文件composer.json - 创建app目录下核心控制器IndexController及进程Http和Monitor - 实现日志工具类Logger,支持多级别及异常格式化 - 配置.gitignore优化忽略无关文件和目录 - 初始化.idea项目配置文件,支持开发环境集成 - 完善启动流程,支持自动加载配置、路由及中间件 - 增加文件变更监控和内存监控机制,提升开发体验 - 设定默认时区为Asia/Shanghai,开启调试模式 - 配置日志输出格式,支持多种日志处理器与颜色高亮 - 提供公共函数文件框架,便于扩展自定义功能
140 lines
4.0 KiB
PHP
140 lines
4.0 KiB
PHP
<?php
|
|
/**
|
|
* This file is part of webman.
|
|
*
|
|
* Licensed under The MIT License
|
|
* For full copyright and license information, please see the MIT-LICENSE.txt
|
|
* Redistributions of files must retain the above copyright notice.
|
|
*
|
|
* @author walkor<walkor@workerman.net>
|
|
* @copyright walkor<walkor@workerman.net>
|
|
* @link http://www.workerman.net/
|
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
|
*/
|
|
|
|
use Dotenv\Dotenv;
|
|
use support\Log;
|
|
use Webman\Bootstrap;
|
|
use Webman\Config;
|
|
use Webman\Middleware;
|
|
use Webman\Route;
|
|
use Webman\Util;
|
|
use Workerman\Events\Select;
|
|
use Workerman\Worker;
|
|
|
|
$worker = $worker ?? null;
|
|
|
|
if (empty(Worker::$eventLoopClass)) {
|
|
Worker::$eventLoopClass = Select::class;
|
|
}
|
|
|
|
set_error_handler(function ($level, $message, $file = '', $line = 0) {
|
|
if (error_reporting() & $level) {
|
|
throw new ErrorException($message, 0, $level, $file, $line);
|
|
}
|
|
});
|
|
|
|
if ($worker) {
|
|
register_shutdown_function(function ($startTime) {
|
|
if (time() - $startTime <= 0.1) {
|
|
sleep(1);
|
|
}
|
|
}, time());
|
|
}
|
|
|
|
if (class_exists('Dotenv\Dotenv') && file_exists(base_path(false) . '/.env')) {
|
|
if (method_exists('Dotenv\Dotenv', 'createUnsafeMutable')) {
|
|
Dotenv::createUnsafeMutable(base_path(false))->load();
|
|
} else {
|
|
Dotenv::createMutable(base_path(false))->load();
|
|
}
|
|
}
|
|
|
|
Config::clear();
|
|
support\App::loadAllConfig(['route']);
|
|
if ($timezone = config('app.default_timezone')) {
|
|
date_default_timezone_set($timezone);
|
|
}
|
|
|
|
foreach (config('autoload.files', []) as $file) {
|
|
include_once $file;
|
|
}
|
|
foreach (config('plugin', []) as $firm => $projects) {
|
|
foreach ($projects as $name => $project) {
|
|
if (!is_array($project)) {
|
|
continue;
|
|
}
|
|
foreach ($project['autoload']['files'] ?? [] as $file) {
|
|
include_once $file;
|
|
}
|
|
}
|
|
foreach ($projects['autoload']['files'] ?? [] as $file) {
|
|
include_once $file;
|
|
}
|
|
}
|
|
|
|
Middleware::load(config('middleware', []));
|
|
foreach (config('plugin', []) as $firm => $projects) {
|
|
foreach ($projects as $name => $project) {
|
|
if (!is_array($project) || $name === 'static') {
|
|
continue;
|
|
}
|
|
Middleware::load($project['middleware'] ?? []);
|
|
}
|
|
Middleware::load($projects['middleware'] ?? [], $firm);
|
|
if ($staticMiddlewares = config("plugin.$firm.static.middleware")) {
|
|
Middleware::load(['__static__' => $staticMiddlewares], $firm);
|
|
}
|
|
}
|
|
Middleware::load(['__static__' => config('static.middleware', [])]);
|
|
|
|
foreach (config('bootstrap', []) as $className) {
|
|
if (!class_exists($className)) {
|
|
$log = "Warning: Class $className setting in config/bootstrap.php not found\r\n";
|
|
echo $log;
|
|
Log::error($log);
|
|
continue;
|
|
}
|
|
/** @var Bootstrap $className */
|
|
$className::start($worker);
|
|
}
|
|
|
|
foreach (config('plugin', []) as $firm => $projects) {
|
|
foreach ($projects as $name => $project) {
|
|
if (!is_array($project)) {
|
|
continue;
|
|
}
|
|
foreach ($project['bootstrap'] ?? [] as $className) {
|
|
if (!class_exists($className)) {
|
|
$log = "Warning: Class $className setting in config/plugin/$firm/$name/bootstrap.php not found\r\n";
|
|
echo $log;
|
|
Log::error($log);
|
|
continue;
|
|
}
|
|
/** @var Bootstrap $className */
|
|
$className::start($worker);
|
|
}
|
|
}
|
|
foreach ($projects['bootstrap'] ?? [] as $className) {
|
|
/** @var string $className */
|
|
if (!class_exists($className)) {
|
|
$log = "Warning: Class $className setting in plugin/$firm/config/bootstrap.php not found\r\n";
|
|
echo $log;
|
|
Log::error($log);
|
|
continue;
|
|
}
|
|
/** @var Bootstrap $className */
|
|
$className::start($worker);
|
|
}
|
|
}
|
|
|
|
$directory = base_path() . '/plugin';
|
|
$paths = [config_path()];
|
|
foreach (Util::scanDir($directory) as $path) {
|
|
if (is_dir($path = "$path/config")) {
|
|
$paths[] = $path;
|
|
}
|
|
}
|
|
Route::load($paths);
|
|
|