swoft 启动流程之一

swoft&swoole

首先我来看下swoft框架的目录结构,如下截图:

swoft框架目录结构

它分了很多模块,而且点进去看详细,几乎每个模块都是独立存在的,就像插件一样,组织结构自由,解耦非常好。

我接下来的解析swoft从启动到正式接收请求的每一个关键点,我们以websocket服务启动为例:php bin/swoft ws:start

1、查看 bin/swoft 的代码

<?php declare(strict_types=1);
// Bootstrap
require_once __DIR__ . '/bootstrap.php';
// 引入启动文件,其实这个启动文件就是为了 composer 生成的自动加载器

Swoole\Coroutine::set([
    'max_coroutine' => 300000,
]);
// 默认设置 swoole同时最多可以支持 300000 个协程,根据自己的机器配置修改。可以参考 swoole的文档

// Run application
// 到这里开始真正的走框架逻辑
(new \App\Application())->run();

2、上面看到 swoft 以 (new \App\Application())作为入口点,下面我们来进行分析

/**
 * Class Application
 *
 * @since 2.0
 */
// Application 继承自 SwoftApplication,在这个类里面我们可以定义一些自己加载配置,但需要 重写父类中已有的方法,那我们直接看 SwoftApplication 类
class Application extends SwoftApplication
{
    protected function beforeInit(): void
    {
        parent::beforeInit();

        date_default_timezone_set('Asia/Shanghai');
    }
}

SwoftApplication 类

/**
 * Swoft application
 *
 * @since 2.0
 */
class SwoftApplication implements SwoftInterface, ApplicationInterface
{
    use SwoftTrait;

    // ... 省略N行代码

    /**
     * Class constructor.
     *
     * @param array $config
     */
     // 这里就是我们的入口点了
    public function __construct(array $config = [])
    {
        // Check runtime env
        // 环境监测,主要是 php和swoole版本
        SwoftHelper::checkRuntime();

        // Storage as global static property.
        Swoft::$app = $this;

        // Before init
        // 这个我们可以在 Application 重写该方法实现
        $this->beforeInit();

        // Init console logger
        // 这里是初始化Log
        $this->initCLogger();

        // Can setting properties by array
        if ($config) {
            ObjectHelper::init($this, $config);
        }

        // Init application
        // 关键在这里,正式开始初始化了 
        $this->init();

        CLog::info('Project path is <info>%s</info>', $this->basePath);

        // After init
        $this->afterInit();
    }
     

    protected function init(): void
    {
        // Init system path aliases
        $this->findBasePath();
        $this->setSystemAlias();
        // 处理器组,这个非常重要,框架中所有核心组件都会在这些处理器加载到内存中
        $processors = $this->processors();

        $this->processor = new ApplicationProcessor($this);
        $this->processor->addFirstProcessor(...$processors);
    }

    /**
     * Run application
     */
    public function run(): void
    {
        if (!$this->beforeRun()) {
            return;
        }
// 这个位置开始调用加载器,下面看 vendor/swoft/framework/src/Processor/ApplicationProcessor.php 类的 handle 方法
        $this->processor->handle();
    }

    /**
     * @return ProcessorInterface[]
     */
    protected function processors(): array
    {
        return [
            // 环境配置
            new EnvProcessor($this),
            // config 配置
            new ConfigProcessor($this),
            // 各模块的注解
            new AnnotationProcessor($this),
            // 各模块的 beans 和 bean.php
            new BeanProcessor($this),
            // 事件处理器和监听链
            new EventProcessor($this),
            // 命令行
            new ConsoleProcessor($this),
        ];
    }

发表评论

电子邮件地址不会被公开。 必填项已用*标注