zanphp原始碼解讀 – 應用的啟動

JeRuen發表於2019-02-16

獲取應用並啟動

php bin/httpd

<?php

#!/usr/bin/env php
<?php

/** @var anFrameworkFoundationApplication $app */
$app = require_once __DIR__.`/../init/app.php`;

$server = $app->createHttpServer();
$server->start();

init/app.php

<?php

use ZanFrameworkFoundationApplication;

require __DIR__ . `/../vendor/autoload.php`;

$appName = `http-demo`;
$rootPath = realpath(__DIR__.`/../`);

$app = new Application($appName, $rootPath);

return $app;

分析 Application

vendor/zanphp/framework/src/Foundation/Application.php

    public function __construct($appName, $basePath)
    {
        // 設定應用名稱
        $this->appName = $appName;

        // 獲取 本身例項
        static::setInstance($this);

        // 想容器註冊單例
        ZanPHPContainer::getInstance()->instance(ApplicationContract::class, $this);

        // 設定 應用 基礎路徑
        $this->setBasePath($basePath);

        // 其他初始化工作
        $this->bootstrap();
    }

    protected function bootstrap()
    {
        // 初始化 容器
        $this->setContainer();
        // 其他初始化工作
        foreach ($this->bootstrapItems as $bootstrap) {
            $this->make($bootstrap)->bootstrap($this);
        }
    }
    
    /**
     * get http server. 建立 httpServer
     *
     * 根據 前面 的知識掃盲 可知道 返回的 真身 是 ZanPHPHttpServerServer 
     * 位於 vendor/zanphp/http-server/src/Server.php
     * @return anFrameworkNetworkHttpServer
     */
    public function createHttpServer()
    {
        /** @var Factory $factory */
        $factory = make(Factory::class, ["server"]);
        $server = $factory->createHttpServer();

        $this->server = $server;

        return $server;
    }

分析 Server.php

vendor/zanphp/http-server/src/Server.php
vendor/zanphp/server-base/src/ServerBase.php

/*
 * 繼承 ZanPHPServerBaseServerBase 
 * 這裡 就 把 ServerBase 中的 函式 都放在 Server 分析了
 */
class Server extends ServerBase
{
    // 服務的啟動主入口函式
    // 服務的啟動主入口函式
    // 服務的啟動主入口函式
    public function start();
    
    // 服務 啟動初始化 包括 自定義的啟動項  配置在  init/ServerStart/.config.php
    function bootServerStartItem();
    
    // worker 啟動初始化 包括 自定義的啟動項  配置在  init/WorkerStart/.config.php
    function bootServerStartItem();
    
    // 請求處理函式
    public function onRequest(SwooleHttpRequest $httpRequest, SwooleHttpResponse $httpResponse)
    {
        // ...
        /** 請求處理類 後續講解 */
        (new RequestHandler())->handle($httpRequest, $httpResponse);
    }
}

相關文章