php框架开发
定义入口文件
定义入口文件主要有三个功能定义常量、引入库函数、引入核心模块
一般我们会在根目录下创建core/common
文件夹,在里面创建一个functoin.php
文件,在这个文件里我们存放常用的库函数
在core
文件夹下我们还需要一个核心库文件,这里我们就命名为myphp.php
实现自动加载
首先在myphp中实现自动加载代码
入口函数中调用自动加载
route实现一个构造函数
页面中访问可以输出route
路由类的实现
这里我们将上一节使用route.php移动到core/lib
下,修改route.php的命名空间
接着在根目录下新建.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类并编写构造函数
接着我们创建数据库并添加数据
继续在index控制器中增加查询数据操作代码
接着在前端页面进行访问,可以看到数据已经被查询出来
模板渲染
首先我们在app下创建view文件并创建index.html页面文件
接着编写用于跳转页面的render
在indexcontroller中向页面文件传递参数
加载配置类
之前我们数据库配置信息写在了db文件中,现在我们将其移动到专门的配置文件中
定义配置文件系统常量
如果我们想要加载db_config.php中的配置信息需要我们在core中添加一个config.php,用来加载配置信息
测试配置类
获取单个配置信息
编写测试方法
前端页面中访问,输出配置信息
获取所有配置信息
在db.php文件中用配置类获取配置信息链接数据库
验证配置类是否成功,直接访问一个请求输出的方法即可
添加日志类
大部分框架都有日志类,用来记录操作日志,首先我们在根目录下创建log文件夹,接着在index.php文件中定义系统常量
接着我们就需要创建一个日志类编写记录日志的方法,在core文件夹下创建log.php
接着在indexController中定一个log方法用来测试写入数据
前端页面放访问该方法,写入数据成功
使用composer安装插件
安装smarty插件
首先我们在myphp.com目录下编写一个composer.json文件用来填写我们需要安装的内容,接着在该目录下打开cmd运行composer install
接着根目录下会出现一个verdor的文件夹
我们将vendor文件夹添加到系统变量中
接着在app目录下新建一个smarty文件夹,并依次创建如下目录
接着在render.php文件编写如下代码
在控制器中编写对应测试方法
在smarty->templates->index下新建一个index.html
页面中进行访问输出对应参数信息
安装whoops
在composer.json中添加whoops信息,任意版本
安装
接着在index控制器中调用一个错误的方法进行测试
这个报错是因为没有配置whoops注册
接着我们再次访问,得到的报错样式如下
安装 var-dumper
在composer.json中添加如下代码,然后进行安装
使用dump显示如下
medoo插件使用
中文手册https://medoo.lvtao.net/1.2/doc.php
安装medoo
添加配置文件
在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类
测试增删改查
创建一个medoo对象
查询数据
插入数据
修改数据
删除数据
使用自己的框架实现留言板
首先新建一个comment控制器
在smarty/templates下新建一个comment文件夹,将之前使用的四个模板html复制进去
根目录下新建一个public/comment目录,将我们的css和js文件放到这里
修改css、js路径
访问测试首页
页面头部分离,新建header文件
包含头部,剩下几个页面同样操作
数据接收
在core/common下的function文件中添加获取get请求参数的函数
重写model层
首先创建数据库
接着在app目录下新建model文件夹,在model中新建一个commnetModel.php文件编写如下内容
调用model
留言板功能实现
发布留言
insertOne
管理留言
manage页面
edit
del
大型网站的核心技术
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之间,可以完成更复杂查询功能的功能,而且支持分片和副本集