# MonkeyPHP
**Repository Path**: long_ren/monkeyphp
## Basic Information
- **Project Name**: MonkeyPHP
- **Description**: MonkeyPHP是一个完全面向对象的轻量级 PHP 框架!
主要特点:
一、目录规范,容易部署。
二、支持 MVC 和 REST 等web架构。
三、路由既高效强大,又易于定制。
四、松耦合设计,易于扩展。
五、安全的数据库操作,无 sql 注入风险。
- **Primary Language**: PHP
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 11
- **Created**: 2017-03-25
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
##MonkeyPHP
MonkeyPHP是一个完全面向对象的轻量级 PHP 框架!
###主要特点:
* 一、设计规范,容易部署。
* 二、支持 MVC 和 REST 等web架构。
* 三、路由既高效强大,又易于定制。
* 四、松耦合设计,易于扩展。
* 五、安全的数据库操作,无 sql 注入风险。
###QQ群:
**275107751(MonkeyPHP)**;
谢谢所有围观、支持的朋友们!
##目录结构
>system(后端系统目录)
>>apps(网站集后端目录)
>>>DefaultApp(具体网站的后端总目录、DefaultApp也是这个网站的顶级命名空间)
>>>>Controller(控制器目录)
>>>>data(配置目录,数据目录,如路由映射表就放在这里)
>>>>LabelApi(模板标签API目录)
>>>>App.php(应用类)
>>>Manual(框架手册网站的后端总目录)
>>vendor(组件集目录)
>>>composer(自动加载组件)
>>>markdown(php markdown lib 组件)
>>>monkey(MonkeyPHP框架组件)
> www(前端虚拟空间目录)
>>defaultForeground(某网站的前端目录)
>>>mySkinName(皮肤样式目录)
>>>public(公共静态资源目录)
>>>.htaccess
>>>index.php(入口文件)
>>.htaccess
>>index.php(入口文件)
defaultForeground目录名是随便起的,里面的入口文件和外面的入口文件差不多:
前端目录内的入口文件 defaultForeground/index.php
//启动自动加载
require(__DIR__.'/../../system/vendor/autoload.php');
//建立应用,参数1:应用命名空间;参数2:前端目录。
$app= new DefaultApp\App(__DIR__);
//运行应用
$app->run();
前端目录外的入口文件 index.php
//启动自动加载
require(__DIR__.'/../system/vendor/autoload.php');
//建立应用, 参数1:应用命名空间; 参数2:前端目录。
$app= new DefaultApp\App(__DIR__ . '/defaultForeground');
//运行应用
$app->run();
##网站配置
###1. 配置的存放位置
system/apps/网站后端目录/data/config.php。
###2. 配置写法
参考:system/vendor/monkey/Globe/data/config.default.php。
###3. 路由映射表配置
存放文件位置:system/apps/网站后端目录/data/router.map.php
/******** 路由器到控制器的映射表——简称路由映射表(示例) ********/
//其中请求方法get可以省略,其它如post等则不能省略
return array(
//静态路由
'get/' =>'Index:index', //'Index:index'相当于请求\DefaultApp\Controller\Index类的actionIndex方法
'/' =>'Index:index', //效果同上
'get/hello' =>'Index:hello',
'/hello' =>'Index:hello', //效果同上
'/blog' =>'Blog\Blog:index', //控制器支持子命名空间
//动态标识路由,使用了路由组件配置中的编译标签
'/{zh|en}:language' =>'Index:index', //{zh|en}的匹配结果将作为参数名language的值
'/blog/{s}:title' =>'Blog:get', //{s}的匹配结果将作为参数名title的值
'post/article/{year}/{month}/{s}:year:month:title' =>'Article:modify', //这里有三个参数
//动态正则路由,路由中直接使用正则表达式,但有个限制:不能嵌套括号!
'/article/([1-9]\d{3})/(1[0,1,2]|[1-9])/([^\/]+):year:month:title'=>'Article:get',
);
##Hello World
本节我们一起来做一个输出“Hello World”的程序。
###1. 下载部署网站
下载并解压 MonkeyPHP,按照目录部署方案一设置好目录。
###2. 配置路由
找到system/apps/DefaultApp/data/router.map.php文件,在其中添加三个路由:
'/'=>'Index:index',
'/{zh|en}:language'=>'Index:index',
'/hello'=>'Index:hello',
###3. 编写控制器
在system/apps/DefaultApp/Controller目录下新建一个Index.php文件:
getRouteParameter();
if(empty($param)){
echo '--你好hello!--
';
}
if($param['language']=='zh'){
echo '--你好!--
';
}
if($param['language']=='en'){
echo '--hello!--
';
}
echo date('Y-m-d H:i:s');
}
public function actionHello()
{
echo '测试hello!
';
}
}
###4. 在浏览器中查看你的杰作
启动你的web服务器,并在浏览器中访问如下网址:
http://web目录/
http://web目录/zh
http://web目录/en
http://web目录/hello
######enjoy!
##程序执行流程
###step1、接受请求
浏览器的所有请求被转移到WWW目录下的index.php文件,这个文件就是接受请求的入口文件。
###step2、启动应用
入口文件创建应用,并运行应用。
###step3、分发路由
路由器查询路由并分发给控制器
###step4、处理请求
继承Monkey\Controller的控制器处理相应的请求。
##URL 路由解析
###1. 路由解析器的构成:路由器+路由表。
这使得站长可以随时在线编辑路由表,从而更方便的控制网站。
URL 中路由字符串的查找模式
(1) **rewrite**:http://… /www/route.html 或 http://… /www/route
(2) **pathinfo**:http://… /www/index.php/route
(3) **get**:http://… /www/index.php?r=route
###2. 查找原理:
路由组件先编译路由表,目的是可以让查询既高效又强大。
路由匹配虽然使用了正则表达式,但是巧妙的编译方式使得查询匹配过程非常高效。
注意:
(1) 当选择 rewrite 查找模式时需要服务器支持,比如 apache 的.htaccess 文件(位置在 www 目录下):
RewriteEngine On
#RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
(2) 当选择 pathinfo 查找模式也需要服务器支持,开启方法请百度哈。注意,IIS默认只支持pathinfo。
##控制器
控制器是 MVC 模式中的核心关键层,一个程序可以没有模型,也可以没有视图,但是控制器是必须有的。
####使用 MonkeyPHP 的控制器类需要遵以下几点。
1. 命名空间规范
\DefaultApp\Controller\控制器路径
2. 继承规范
必须继承 Monkey\Controller,如:
getRouteParameter();
if(empty($param)){
echo '--你好hello!--
';
}
if($param['language']=='zh'){
echo '--你好!--
';
}
if($param['language']=='en'){
echo '--hello!--
';
}
echo date('Y-m-d H:i:s');
}
public function actionHello()
{
echo '测试hello!
';
}
}
同时访问方法 必须是以 action 为前缀,如上 actionIndex 、actionHello
##视图
MonkeyPHP 的视图组件既可单独使用:$app->view(); 也可继承View使用。Widget就是继承视图组件的,你要使用Widget则只能继承Widget。
##视图中的模板标签说明
MonkeyPHP 的模板类和标签方案是分离的。 标签方案目前只提供了 \Monkey\View\Tag 方案,你可以参考并修改为其它方案,比如 dede 的、ThinkPHP 的等等。
##模型
MonkeyPHP 没有提供模型,而是提供了Drupal的数据库组件,在保持原逻辑和使用接口的前提下作了适当的精简。
##代码规范
MonkeyPHP的代码规范绝大多数是遵循PSR-0,1,2中的标准。
##安全解决方案
###1. CSRF 跨站请求伪造解决方案:表单提交时使用 token 效验
请自己实现
###2. XSS 跨站脚本攻击解决方案:过滤浏览器输入的值
**使用方法:**
选择上节 Monkey\Library\Filter 类中的 xss####方法来过滤输入值:
(1) **xssToText($data)**,直接删除所有 html 和 php 标签,使得浏览器输入的内容只剩下文本,是最高级别的过滤;
(2) **xssToHtml($data)**,不是删除任何标签,但对标签进行彻底的编码,使得浏览器输入的内容按源码输出,是普通级别的过滤;
(3) **xssDeleteScript($data)**,有选择性的删除 javascript,iframes,object 等有害标签,使得其它内容能保留浏览器输入的 html 样式,是最弱的过滤级别;
###3. SQL 防注入解决方案:drupal数据库组件
原理(详见源码)
###4. 目录遍历漏洞解决方案:不向浏览器输出后台目录变量
MonkeyPHP 的目录部署分为两个部分
(1) **www** 目录,是 web 服务器指定浏览器可以访问的虚拟目录,这里仅仅存放静态资源文件和浏览器上传的文件。同时还要通过系统设置保证这个目录里的文件没有执行权。
(2) **system** 目录绝不能让浏览器有访问权限。
###5. DDOS 攻击解决方案:拦截浏览器恶意刷新
公共函数中有一个有效拦截防御 DDOS 的代码。如需使用,请在 system/vendor/autoload.php 文件末尾新增一行 intercept_DDOS();
###6. 会话劫持解决方案:请使用 SSH 或 https 协议取代 http 协议
##安全工具——过滤浏览器输入类:Monkey\Library\Filter
###1. 公开方法:
**方法名:** ::compressWhite
**参数:** array|string $data 待处理数据
**作用:** 压缩空白字符(包括多余的换行)。返回原格式数据。
**方法名:** ::xssToText 深度防止XSS攻击代码
**参数:** array|string $data 待处理数据
**作用:** 删除 html 和 php 标签,使得结果只剩下文本,同时\n等换行符号也会转换。返回原格式数据。
**方法名:** ::xssToHtml 中度防止XSS攻击代码
**参数:** array|string $data 待处理数据
**作用:** 编码为 HTML 文本,使得浏览器输入的内容按源码输出。返回原格式数据。
**方法名:** ::xssDeleteScript 轻度防止XSS攻击代码
**参数:** array|string $data 待处理数据
**作用:** 删除 javascript,iframes,object等代码,保留 html 样式。返回原格式数据。
**方法名:** ::nl2br
**参数:** array|string $data 待处理数据
**作用:** 转化文本中的换行符号为
。返回原格式数据。
**方法名:** ::nl2delete
**参数:** array|string $data 待处理数据
**作用:** 删除文本中的换行符号。返回原格式数据。
**方法名:** ::phptag
**参数:** array|string $data 待处理数据
**作用:** 仅仅编码 PHP 标签。返回原格式数据。
###2. 注意:
(1) ::white 主要减少浏览器输入的冗余信息量。
(2) ::xss####则主要用来防止 xss 攻击。
(3) 本类都是静态类,且所有方法均返回原$data 格式的数据。
##协议
MonkeyPHP 是一个开源的 PHP 框架。发布协议使用 BSD 许可证。
版权所有 2011-2014 年由 MonkeyPHP 组织(http://www.monkeyphp.org)保留所有权利。
BSD 开源协议是一个给于使用者很大自由的协议。基本上使用者可以“为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。
但“为所欲为”的前提当你发布使用了 BSD 协议的代码,或则以 BSD 协议代码为基础做二次开发自己的产品时,需要满足三个条件:
> 如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的 BSD 协议。
如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的 BSD 协议。
不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。
BSD 代码鼓励代码共享,但需要尊重代码作者的著作权。BSD 由于允许使用者修改和重新发布代码,也允许使用或在 BSD 代码上开发商业软件发布和销售,因此是对 商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选 BSD 协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。