国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

關(guān)于workerman/webman項(xiàng)目的建議

chaz6chez

webman剛出來(lái)的時(shí)候我閱讀過(guò)webman的代碼,也閱讀過(guò)其他框架的代碼,然后我自己擼了一個(gè)框架casualman,最早單純只是為了玩,后面我把他運(yùn)用在了公司部分項(xiàng)目的生產(chǎn)環(huán)境,已經(jīng)穩(wěn)定運(yùn)行了半年以上了。

在這個(gè)過(guò)程中,結(jié)合我自己的一些個(gè)人習(xí)慣和我看到的其他框架的一些好的地方,我發(fā)現(xiàn)webman的代碼在一些地方可以被建議:

入口文件start.php比較凌亂臃腫

其實(shí)本著可以用就沒(méi)問(wèn)題的思路,我覺(jué)得代碼寫成什么樣,只要沒(méi)有影響閱讀,其實(shí)不用過(guò)分追求所謂的優(yōu)雅和美感,但是吧,我比較強(qiáng)迫癥,我個(gè)人還是有這么一個(gè)建議,覺(jué)得webman的入口文件可以精簡(jiǎn)干練;我自己的框架在入口文件是這么寫的:

declare(strict_types=1);

ini_set('date.timezone','Asia/Shanghai');
ini_set('memory_limit', '256M');
define('ROOT_PATH'  , dirname(__DIR__));
require_once ROOT_PATH . '/vendor/autoload.php';
require_once ROOT_PATH . '/helpers.php';

use Kernel\ApplicationFactory;
use Utils\Tools;

try{
    (new ApplicationFactory())('3Y-CLEARING-CENTER','2.0.0', function(){
        // 中間件
        Co()->get(\Kernel\Middlewares::class)->init('3Y-CLEARING-CENTER');
        // 注冊(cè)錯(cuò)誤收集
        set_error_handler(function (...$params){
            Tools::log('error_handler', $params, runtime_path());
        },DEBUG ? E_ALL : E_WARNING|E_ERROR);
    })->run();
}catch(Throwable $throwable){
    dump($throwable);
    exit("{$throwable->getMessage()}|{$throwable->getCode()}" . PHP_EOL);
}

其中,類ApplicationFactory 分別利用application()和__invoke()做了初始化的工作;
application()做了一些進(jìn)程啟動(dòng)、事件綁定、協(xié)議綁定、端口綁定等工作;每種進(jìn)程基礎(chǔ)都有onStart、onReload、onStop三個(gè)方法,如果是監(jiān)聽(tīng)類型的進(jìn)程還會(huì)有onBufferDrain、onBufferFull、onMessage、onConnect、onClose、onError六個(gè)方法,以上兩種類型的進(jìn)程分別用AbstractProcess::classs和ListenerInterface的實(shí)現(xiàn)來(lái)區(qū)分,以下代碼有體現(xiàn):

    public static function application(?string $app = null, bool $skip = false){
        $process = Config::get('process');
        if($app !== null and !isset($process[$app])){
            exit('Not found the app' . PHP_EOL);
        }
        if(!$skip){
            try {
                foreach ($process as $name => $config){
                    if($app !== null and $app !== $name){
                        continue;
                    }
                    $handle = make($config['handler']);
                    if($handle instanceof AbstractProcess){
                        $handle = ($handle)();
                        $handle->name = $name ?? 'unknown';
                        $handle->count = isset($config['count']) ? $config['count'] : 1;
                        $handle->reloadable = isset($config['reloadable']) ? $config['reloadable'] : true;
                    }
                    if(
                        $handle instanceof ListenerInterface and
                        $handle instanceof AbstractProcess and
                        isset($config['listen'])
                    ){
                        $handle->setSocketName($config['listen']);
                        $handle->reusePort = isset($config['reusePort']) ? $config['reusePort'] : true;
                        $handle->transport = isset($config['transport']) ? $config['transport'] : 'tcp';
                        $handle->protocol = isset($config['protocol']) ? $config['protocol'] : null;
                    }
                }
            }catch (\Throwable $throwable){
                exit($throwable->getMessage());
            }
        }
        AbstractProcess::runAll();
    }

__invoke()做了一些基礎(chǔ)內(nèi)容的初始化操作:

    public function __invoke(?string $name = null, ?string $version = null, ?callable $func = null) : Application
    {
        self::$name = $name ?? self::$name;
        self::$version = $version ?? self::$version;
        $this->_env();//env初始化
        $this->_config();//config目錄初始化
        $this->_log();//log初始化
        if($func){
            $func();//執(zhí)行回調(diào)
        }
        $this->_app = make(Application::class, self::$name, self::$version);
        foreach (self::commands() as $command){
            $this->_app->add(new $command);
        }
        return $this->_app;
    }

上述代碼種Application::class實(shí)際上是實(shí)現(xiàn)了Symfony/Console組件的入口,為什么workerman已經(jīng)有了自己的命令,還需要引入這個(gè)組件呢?實(shí)際上我考慮到在很多場(chǎng)景下除了workerman提供的基礎(chǔ)命令外,開(kāi)發(fā)者也需要一些自定義的命令來(lái)執(zhí)行一些腳本或者處理器,比如初始化ORM、清除文件緩存、執(zhí)行額外進(jìn)程等,既然要使用,那我想著索性引入Symfony/Console組件統(tǒng)一管理,并且實(shí)現(xiàn)映射workerman自身的命令作為基礎(chǔ)命令

以上僅僅是我個(gè)人的建議,并不代表我覺(jué)得webman不優(yōu)秀,相反,我是覺(jué)得webman足夠優(yōu)秀,我也足夠喜愛(ài)workerman及其生態(tài)才愿意花時(shí)間來(lái)建議,勿噴!

2880 1 1
1個(gè)評(píng)論

walkor

非常感謝你的建議。

同感,start.php 確實(shí)相比其它入口文件代碼有點(diǎn)多,不過(guò)隨著版本不斷迭代start.php這部分也在慢慢在整理。后面版本會(huì)做到條理清晰代碼精簡(jiǎn)。

你的 casualman 項(xiàng)目很帥氣!

  • chaz6chez 2022-01-04

    哈哈~3Q3Q~希望workerman及生態(tài)越來(lái)越好!

年代過(guò)于久遠(yuǎn),無(wú)法發(fā)表評(píng)論

chaz6chez

5174
積分
0
獲贊數(shù)
0
粉絲數(shù)
2018-11-16 加入
??