继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

SWOOLE 从入门到放弃之写个小框架(十)

Pizzaaa
关注TA
已关注
手记 23
粉丝 77
获赞 47

接下来该写什么呢,改造App.php吧。

首先创建配置文件config/app.php,代码如下

<?php
/**
 * APP配置
 */
return [
    'name'      => 'server',                            //项目名称
    'namespace' => 'app',                               //项目命名空间
    'path'      => realpath (__DIR__.'/../app/'),  //项目所在路径
    'gzip'      => 0,                                    //gzip 等级, 请查看  https://wiki.swoole.com/wiki/page/410.html

    //server设置
    'ip'        => '0.0.0.0',   //监听IP
    'port'      => 9527,        //监听端口
    'server'    => 'websocket' ,     //服务,可选 websocket 默认http

    'set'       => [            //配置参数  请查看  https://wiki.swoole.com/wiki/page/274.html
        'daemonize'             => 0 ,
        'enable_static_handler' => TRUE ,
        'document_root'         => realpath (__DIR__.'/../static/') ,
        'worker_num'            => 4,
        'max_request'           => 10000,
        'task_worker_num'       => 4,
    ],

];

修改 frame/base.php,读取config/app.php,向框架注册命名空间和其所在路径 ,增加如下代码

//注册项目命名
\Piz\Loader::addNamespace (config('app.namespace'),config('app.path'));

修改frame/Lib/App.php ,修改后的代码如下

<?php
namespace Piz;
class App
{
    //实例
    private static $instance;
    //映射表
    private static $map = [];
    //防止被一些讨厌的小伙伴不停的实例化,自己玩。
    private function __construct ()
    {
    }

    //还得让伙伴能实例化,并且能用它。。
    public function get_instance(){
        if(is_null (self::$instance)){
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function http($server,$request,$response){
        if($request->server['request_uri'] == '/favicon.ico') return ;
        $req    = Request::get_instance ();
        $req->set($request);
        $router = Router::get_instance ()->http($req->server['request_uri']);

        $app_namespace  = Config::get_instance ()->get('app.namespace');
        $module         = $router['m'] ;
        $controller     = $router['c'] ;
        $action         = $router['a'] ;
        $param          = $router['p'] ;
        $classname      = "\\{$app_namespace}\\modules\\{$module}\\{$controller}" ;

        if(!isset(self::$map[$classname])){
            $class      = new $classname ;
            self::$map[$classname]         = $class;
        }
        try{
            //测试效果
            if(!empty(ob_get_contents ())) ob_end_clean ();
            ob_start();
            self::$map[$classname]->$action($param);
            $content = ob_get_contents();
            ob_end_clean();
            $response->end($content);
        }catch(\Exception $e){      //在此处返回 404错误的原因是因为加载器已经在查找不到文件时有说错误说明
            $response->header('Content-type',"text/html;charset=utf-8;");
            $response->status(404);
            $response->end('404 NOT FOUND');
            return ;
        }
    }
}

App->http方法增加了一个参数$server,所以frame/Lib/Server.php的onRequest方法也要同时修改,修改后的代码如下

public function onRequest($request,$response){
        App::get_instance()->http ($this->server,$request,$response);
    }

创建项目文件app/modules/index/index.php,代码如下

<?php
<?php
namespace app\modules\index;
class index
{
    public function init(){
        echo  date('Y-m-d h:I:s'),'<br/>';
        echo __CLASS__;
    }
}

运行效果如下图图片描述

今天就写到这了,累了。明天开始修改frame/Lib/Server.php

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP