php框架开发

定义入口文件

定义入口文件主要有三个功能定义常量、引入库函数、引入核心模块

1658993161772

一般我们会在根目录下创建core/common文件夹,在里面创建一个functoin.php文件,在这个文件里我们存放常用的库函数

1658993152646

core文件夹下我们还需要一个核心库文件,这里我们就命名为myphp.php

1658993146164

实现自动加载

首先在myphp中实现自动加载代码

1658995737712

入口函数中调用自动加载

1658995775065

route实现一个构造函数

1658995799104

页面中访问可以输出route

1658995819565

路由类的实现

这里我们将上一节使用route.php移动到core/lib下,修改route.php的命名空间

1658996061401

接着在根目录下新建.httaccess文件,在文件内写入如下内容,定义入口文件为index

<IfModule mod_rewrite.c>
    # 打开Rerite功能
    RewriteEngine On

    # 如果请求的是真实存在的文件或目录,直接访问
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    # 如果访问的文件或目录不是真事存在,分发请求至 index.php
    RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]

</IfModule>

接着我们配置路由,首先从$_SERVER中获取请求的路径平将其分割为数组,然后判断是否存在index.php,如果存在就将其去掉,接着依次取到控制器,方法,参数

<?php
namespace core\lib;
class route{
    public $ctrl = "index"; //控制器
    public $action = "index";   //方法
    public $params = [];    //参数
    public function __construct(){
//        echo "route";
//        p($_SERVER);
        if(isset($_SERVER['REQUEST_URI'])&&($_SERVER['REQUEST_URI']!="/")){
            $pathString = $_SERVER["REQUEST_URI"];
//            echo $pathString;
            $path_arr = explode("/",trim($pathString,"/"));//explode字符串分割为数组
//            p($path_arr);
        }
        //去除index.php
        if(isset($path_arr[0])&&($path_arr[0]=="index.php")){
            $path_arr = array_slice($path_arr,1,count($path_arr)-1);
            //array_slice() 函数在数组中根据条件取出一段值,并返回。
            //array_slice(array,start(规定取出元素的开始位置),length(规定被返回数组的长度),preserve(可选,规定函数是保留键名还是重置键名))
            p($path_arr);
        }
        //依次判断控制器、方法
        if(isset($path_arr[0])){
            if(isset($path_arr[0])){
                $this->ctrl = $path_arr[0];
            }
            if(isset($path_arr[1])){
                $this->action = $path_arr[1];
            }
            //获取参数,参数一般是成对出现,且会有多个参数的情况
            $i = 2; //参数在数组中出现的位置是2
            $count = count($path_arr);
            while($i<$count){
                if(isset($path_arr[$i+1])){//$i位置的为key值,$i+1位置的为value值
                    $this->params[$path_arr[$i]] = $path_arr[$i+1];
                }
                //移动到下一个参数
                $i = $i+2;
            }
        }
        p($this->ctrl);
        p($this->action);
        p($this->params);
    }
}

控制器的加载

首先我们在控制中编写如下测试代码

<?php
namespace app\controller;
class indexController{
    public function index(){
        echo "index Controller";
    }
}

接着在myphp.php文件中,编写myphp类的run方法如下

public static function run()
    {
//        p("ok");
        $route = new \core\lib\route();
        //实现加载控制器
        $ctrl = $route->ctrl;        //路由中获取的控制器参数
        $action = $route->action;  //路由中获取的方法参数
        $controllerFile = APP."/controller/".$ctrl."Controller.php";
        $controllerClass = "\\app\\controller\\".$ctrl."Controller";
        if(is_file($controllerFile)){//判断访问控制器文件是否存在
            require $controllerFile;//包含控制器文件
            $controller = new $controllerClass;//创建控制器类
            $controller->$action();//执行控制器对应的方法
        }else{
            throw new \Exception("Controller not found");
        }
    }

连接数据库

首先我们在common中定义一个db类并编写构造函数

1659009432080

接着我们创建数据库并添加数据

1659009657035

继续在index控制器中增加查询数据操作代码

1659010255182

接着在前端页面进行访问,可以看到数据已经被查询出来

1659010360338

模板渲染

首先我们在app下创建view文件并创建index.html页面文件

1659011005150

接着编写用于跳转页面的render

1659012626450

在indexcontroller中向页面文件传递参数

1659012771934

加载配置类

之前我们数据库配置信息写在了db文件中,现在我们将其移动到专门的配置文件中

定义配置文件系统常量

如果我们想要加载db_config.php中的配置信息需要我们在core中添加一个config.php,用来加载配置信息

测试配置类

1659014020814

获取单个配置信息

1659014685291

编写测试方法

1659014027214

前端页面中访问,输出配置信息

1659014044552

获取所有配置信息

1659014527966

在db.php文件中用配置类获取配置信息链接数据库

1659014770549

验证配置类是否成功,直接访问一个请求输出的方法即可

1659014487369

添加日志类

大部分框架都有日志类,用来记录操作日志,首先我们在根目录下创建log文件夹,接着在index.php文件中定义系统常量

1659015438120

接着我们就需要创建一个日志类编写记录日志的方法,在core文件夹下创建log.php

1659016239863

接着在indexController中定一个log方法用来测试写入数据

1659015979257

前端页面放访问该方法,写入数据成功

1659016261830

使用composer安装插件

安装smarty插件

首先我们在myphp.com目录下编写一个composer.json文件用来填写我们需要安装的内容,接着在该目录下打开cmd运行composer install

1659016999120

接着根目录下会出现一个verdor的文件夹

1659017085549

我们将vendor文件夹添加到系统变量中

1659017506997

1659017514073

接着在app目录下新建一个smarty文件夹,并依次创建如下目录

1659017680931

接着在render.php文件编写如下代码

1659017887356

在控制器中编写对应测试方法

1659018119933

在smarty->templates->index下新建一个index.html

1659018166181

页面中进行访问输出对应参数信息

1659018187983

安装whoops

在composer.json中添加whoops信息,任意版本

1659018381421

安装

1659018439561

接着在index控制器中调用一个错误的方法进行测试

1659058013837

这个报错是因为没有配置whoops注册

1659058181856

接着我们再次访问,得到的报错样式如下

1659060903167

安装 var-dumper

在composer.json中添加如下代码,然后进行安装

1659061179795

使用dump显示如下

1659061381450

medoo插件使用

中文手册https://medoo.lvtao.net/1.2/doc.php

安装medoo

1659062111875

添加配置文件

在config下新建一个medoo_config.php添加如下代码

return array(
    'database_type' => 'mysql',
    'database_name' => 'myphp',
    'server' => 'localhost',
    'username' => 'root',
    'password' => 'root',
    'charset' => 'utf8',
    'port' => 3306,// 可选参数
    'prefix' => 'my_',// 定义表的前缀
);

接着在core中新建一个medoo类

1659062943191

测试增删改查

创建一个medoo对象

1659063280585

查询数据

1659063667945

插入数据

1659063941369

修改数据

1659064191589

删除数据

1659064278408

使用自己的框架实现留言板

首先新建一个comment控制器

在smarty/templates下新建一个comment文件夹,将之前使用的四个模板html复制进去

1659064996740

根目录下新建一个public/comment目录,将我们的css和js文件放到这里

1659065098221

修改css、js路径

1659065266135

访问测试首页

1659065279411

页面头部分离,新建header文件

1659065447139

包含头部,剩下几个页面同样操作

1659065654437

数据接收

在core/common下的function文件中添加获取get请求参数的函数

1659072572078

重写model层

首先创建数据库

1659073170281

接着在app目录下新建model文件夹,在model中新建一个commnetModel.php文件编写如下内容

1659073363387

调用model

1659073741650

留言板功能实现

发布留言

1659075590790

insertOne

1659075619576

管理留言

manage页面

1659076808640

edit

1659078600276

del

1659078613825

大型网站的核心技术

nginx 和 apache的对比

nginx的使用场景

反向代理:

反向代理(ReverseProxy)是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,简单来说就是真实的服务器不能直接被外部网络访问,想要访问必须通过代理。
反向代理的作用
---防止主服务器被恶意攻击
---为负载均衡和动静分离提供实现支持

负载均衡
负载均衡 : 使用反向代理同时代理多个相同内容的应用服务器(比如Apache),将客户端请求分发到各个应用服务器上并接收响应返回给客户端
负载均衡的作用:当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此一来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。

动静分离
运用Nginx的反向代理功能分发请求:所有动态资源的请求交给应用服务器,而静态资源的请求(例如图片、视频、CSS、JavaScript文件等)则直接由Nginx返回到浏览器

动静分离的作用:主要是nginx处理静态页面的效率远高于Apache的处理能力,使用c语言开发的nginx对静态资源每秒的吞吐量远高于其它应用服务器

NOSQL讲解

非关系型数据库
关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据

Memcached 分布式服务器集群 addServer
Memcache是缓存数据类型只有kv

Redis
Redis有丰富的数据类型hash set list kv..而且支持AOF RDB持久化,当然也可以把它当做缓存使用(需要关闭AOF,RDB)持久化功能

mongoDB
MongoDB 是一款NOSQL数据库 介于关系型数据库与NOSQL之间,可以完成更复杂查询功能的功能,而且支持分片和副本集

最后修改:2022 年 11 月 11 日
如果觉得我的文章对你有用,请随意赞赏