Create your Gitee Account
Explore and code with more than 6 million developers,Free private repositories !:)
Sign up
This repository doesn't specify license. Without author's permission, this code is only for learning and cannot be used for other purposes.
Clone or download
Cancel
Notice: Creating folder will generate an empty file .keep, because not support in Git
Loading...
readme.md

##MonkeyPHP

MonkeyPHP是一个完全面向对象的轻量级 PHP 框架!

###主要特点:

  • 一、设计规范,容易部署。
  • 二、支持 MVC 和 REST 等web架构。
  • 三、路由既高效强大,又易于定制。
  • 四、松耦合设计,易于扩展。
  • 五、安全的数据库操作,无 sql 注入风险。

###QQ群: 275107751(MonkeyPHP)

谢谢所有围观、支持的朋友们!

##目录结构

system(后端系统目录)

apps(网站集后端目录)

DefaultApp(具体网站的后端总目录、DefaultApp也是这个网站的顶级命名空间)

Configs(配置目录)
Controller(控制器目录)
data(数据目录,如路由映射表就放在这里)
LabelApi(模板标签API目录)
AppCli.php(控制台类)
AppWeb.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= \Monkey\Monkey::createApp('DefaultApp',strtr(__DIR__,DIRECTORY_SEPARATOR,'/'));  
//运行应用  
$app->run();

前端目录外的入口文件 index.php

//启动自动加载  
require(__DIR__.'/../system/vendor/autoload.php');  
//建立应用, 参数1:应用命名空间; 参数2:前端目录。  
$app= \Monkey\Monkey::createApp('DefaultApp',strtr(__DIR__,DIRECTORY_SEPARATOR,'/').'/defaultForeground');  
//运行应用  
$app->run(); 

##网站配置

###1. 配置的存放位置
system/apps/网站后端目录/Configs/内。

###2. 配置写法 system/vendor/monkey/Globe/Configs/内有默认配置供你参考。

###3. 基础配置 存放文件:base.ini.php

\Monkey\App\Config::set('timezone','PRC');
\Monkey\App\Config::set('action_prefix','action');

读取方法:

$action_prefix= $app->getConfig('action_prefix','');

###4. 组件配置 存放文件:组件名.ini.php,如cache.ini.php

/**
 * 缓存组件提供者
 */
\Monkey\App\Config::setComponentProvider('cache',
    array(
        'default_provider'=>'file',//默认提供者
        'file'            =>'\Monkey\Cache\File', //每个提供者的具体类
        'apc'             =>'\Monkey\Cache\Apc',
    )
);
/**
 * 文件缓存的专用配置 , 3个参数, 参数1:组件名, 参数2:提供者名, 参数3:具体配置(一般为数组)
 */
\Monkey\App\Config::setComponentConfig('cache','file',
    array(
        'expire'=>3600,//默认缓存时间
        'dir'           =>'/temp/fileCache',//缓存文件的绝对路径,留空为 temp目录/filecache
        'filename'      =>'data',
        'filesize'      =>'15M',
        'check'         =>false,
    )
);
/**
 * apc缓存的专用配置
 */
\Monkey\App\Config::setComponentConfig('cache','apc',
    array(
        'expire'=>3600,//默认缓存时间
    )
);

读取方法:

$config=$app->config->getComponentConfig('cache','apc');

##路由配置

###1. 路由组件配置 存放文件名:route.ini.php

/**
 * 路由组件提供者
 */
\Monkey\App\Config::setComponentProvider(
	'router',
    array(
	    'default_provider'=>'default',
	    'default' =>'\Monkey\Router\Router',
    )
);
/**
 * MonkeyPHP提供的默认路由组件的配置
 */
\Monkey\App\Config::setComponentConfig(
	'router',
	'default',
    array(
	    //路由存贮配置,相对应用目录。
	    'map_file' => '/data/router.map.php',//路由器到控制器的映射表
	    'pattern_option'=>array(
		    //路由匹配时的编译标签,简记名(只能用一对花括号括起来)=>正则表达式(只能用一对括号括起来)
		    '{i}' =>"(\d+)",
		    '{s}' =>"([^\/]+)",
		    '{year}' =>"([1-2]\d{3})",
		    '{month}' =>"(1[0,1,2]|[1-9])",
		    '{day}' =>"([1-9]|[1,2][0-9]|3[0,1])",
		    '{name}' =>"(\w+)",
		    '{zh|en}' =>"(zh|en)",
		    '{json}' =>"(\.json)",
	    ),
    	'router_class_auto_prefix'=>true, //自动将router表中类名加上前缀 \应用命名空间\Controller\
     
	    //三个选择:rewrite(需服务器支持)、pathinfo(需服务器支持)、get(传统方式)
	    'search_mode' =>'rewrite',
	    //get字段上的显式方法设置,如http://www.xxx.php?r=index
	    'search_get' =>'r',
	)
);

###2. 路由映射表配置 存放文件位置:system/apps/DefaultApp/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文件:

<?php
namespace DefaultApp\Controller;
 
use Monkey\Controller\Web;
 
/**
 * 控制器示例 Index
 */
class Index extends Web
{
    public function actionIndex()
    {
	    $param = $this->getRouteParameter();

	    if(empty($param)){
	    	echo '--你好hello!--<br/>';
	    }
	    if($param['language']=='zh'){
	    	echo '--你好!--<br/>';
	    }
	    if($param['language']=='en'){
	    	echo '--hello!--<br/>';
	    }
	    echo date('Y-m-d H:i:s');
    }
     
    public function actionHello()
    {
    	echo '测试hello!<br/>';
    }
}

###4. 在浏览器中查看你的杰作 启动你的web服务器,并在浏览器中访问如下网址:
http://web目录/
http://web目录/zh
http://web目录/en
http://web目录/hello
######enjoy!

##程序执行流程

###step1、接受请求 浏览器的所有请求被转移到WWW目录下的index.php文件,这个文件就是接受请求的入口文件。

###step2、启动应用 入口文件创建应用,并运行应用。

###step3、分发路由 路由器查询路由并分发给控制器

###step4、处理请求 继承Monkey\Controller\Web的控制器处理相应的请求。

##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 目录下):

	<IfModule mod_rewrite.c>  
	RewriteEngine On  
	#RewriteBase /  
	RewriteCond %{REQUEST_FILENAME} !-f  
	RewriteCond %{REQUEST_FILENAME} !-d  
	RewriteRule ^(.*)$ index.php/$1 [L]  
	</IfModule>  

(2) 当选择 pathinfo 查找模式也需要服务器支持,开启方法请百度哈。注意,IIS默认只支持pathinfo。

##控制器

控制器是 MVC 模式中的核心关键层,一个程序可以没有模型,也可以没有视图,但是控制器是必须有的。

####使用 MonkeyPHP 的控制器类需要遵以下几点。

  1. 命名空间规范
    \DefaultApp\Controller\控制器路径

  2. 继承规范
    必须继承 Monkey\Controller\Web 或 Monkey\Controller\Cli 之一,如:

     <?php
     namespace DefaultApp\Controller;
      
     use Monkey\Controller\Web;
      
     /**
      * 控制器示例 Index
      */
     class Index extends Web
     {
         public function actionIndex()
         {
     	    $param=$this->getRouteParameter();
    
     	    if(empty($param)){
     	    	echo '--你好hello!--<br/>';
     	    }
     	    if($param['language']=='zh'){
     	    	echo '--你好!--<br/>';
     	    }
     	    if($param['language']=='en'){
     	    	echo '--hello!--<br/>';
     	    }
     	    echo date('Y-m-d H:i:s');
         }
          
         public function actionHello()
         {
         	echo '测试hello!<br/>';
         }
     }

##视图

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 协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。

Comments ( 0 )

Sign in for post a comment

About

MonkeyPHP是一个完全面向对象的轻量级 PHP 框架! 主要特点: 一、目录规范,容易部署。 二、支持 MVC 和 REST 等web架构。 三、路由既高效强大,又易于定制。 四、松耦合设计,易于扩展。 五、安全的数据库操作,无 sql 注入风险。 spread retract
Cancel

Releases

No release

Contributors

All

Activities

load more
can not load any more