1 Star 0 Fork 8

feiman/SummerPHP

forked from myDcool/CornerPHP 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

SummerPHP

模块化, 层级少, 无依赖, 易上手, 支持多数据库链接/读写分离/分库分表, 的微型PHP框架
参考文档: http://doc.hearu.top/http://www.zhangzhibin.com/

目录结构

Summer PHP Framework
|-- core    框架的核心类
|-- config  配置文件
|-- libs    第三方库
|-- model   模型类, 理论上用于写获取数据的具体逻辑, 只放置在根目录下, 任何控制器都可以调用到
|-- modules 项目模块
|-- view   视图文件
|-- tool   框架自带的登录注册模块的SQL,数据库配置文件样例,windows启动php-cgi的脚本
|-- update   框架自更新脚本
|-- static  静态文件存放
|-- cli.php  命令行下的入口文件 php cli.php -q m/c/a/
`-- index.php   入口文件

主要用法参考

  1. 下载框架代码
  2. 配置NGINX
    server {
        listen       80;
        server_name  www.test.com;
    
        location ~ \.ico|jpg|gif|png|js|css|woff2$ {
            root E:/php/code/project/static;
            #expires 1h;
        }
    
        location / {
            root E:/php/code/project;
            fastcgi_pass   127.0.0.1:9720;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root/index.php;
            include        fastcgi_params;
        }
    
    }
  3. 修改hosts文件,添加:
    127.0.0.1 www.test.com
    
  4. 复制并修改 tool/dbConfig.json 文件中的数据库链接信息, 放到某个目录下; 修改入口文件index.php/cli.php 中的MYSQL_HOST_FILE值为dbConfig.json的文件路径
  5. 启动nginx; 启动php: php-cgi.exe(windows) 或 php-fpm (Linux)
  6. 在浏览器中输入 www.test.com 访问首页 (首页默认是数据库信息)

URL访问规则

所有对外可访问的接口都要在 config/Routeconfig.php中配置映射规则, 接口与真正的方法是映射关系, 不直接暴露源代码的方法名

例如: 获取文章列表的第二页接口的映射规则为

['article_list_(\d+)' => 'index/index/route/page/$1']

那么浏览器中应该这样访问

http://www.test.com/article_list_2 

如果浏览器中只输入域名,没有URI,框架会找到 modules/index/index.php::index() 方法并执行

获取请求数据

注: 可通过配置文件, 细化的对每个方法的每个数据进行检查, 并提供基本的数据校验方法

Request::Get('a', 'default');
Request::Post('a');
Request::Cookie('a');
Request::Route('a');

Request::isPost();
Request::getClientIp();
...

响应JSON格式数据

$a = ['list' => [1,2,3,4]];

输出固定格式的json数据

Response::json(10000, '用户列表', $a); 
结果: {"code":10000,"msg":"\u7528\u6237\u5217\u8868","data":{"list":[1,2,3,4]}}

Response::json()的简写, 结构是一样的

Response::success($a);
Response::success($a, '用户列表');
Response::success($a, '用户列表', 20000);

Response::error('参数错误'); 
结果: {"code":"-1","msg":"\u53c2\u6570\u9519\u8bef","data":[]]}
Response::error('参数错误', $a); 
结果: {"code":"-1","msg":"\u53c2\u6570\u9519\u8bef","data":{"list":[1,2,3,4]},"url":""}
Response::error('参数错误', $a, 20001); 
结果: {"code":2001,"msg":"\u53c2\u6570\u9519\u8bef","data":{"list":[1,2,3,4]}}

返回任意结构的json数据

Response::jsonReturn($a); //{"list":[1,2,3,4]}

响应HTML数据

Response::notify('页面找不到啦~'); //页面找不到啦~
Response::redirect('充值成功, 页面即将跳转', 'http://www.hearu.top', 3);
Response::jump('http://www.hearu.top'); //直接跳转

View::display(); //显示单个页面
View::render(); //插入式显示页面(一个HTML页面框架, 里边有占位符:{{xxx}})

数据库操作

更多增删改查操作请查看 modules/index/index.php::sql()

$rs = Test::link('note')->fields('id,content')
        ->where(['uid' => 1, 'age' => 20])
        ->whereOp('id', '>', 1)
        ->order('id desc')
        ->limit(10)
        ->select()
        ->getAll();

    echo '<pre>';var_dump($rs, Test::$currentSql);
   

文件日志

FileLog::ini(['summer', 'test'], 'test')->info('哈哈哈哈');//文件名为 summer/test/test.log

FileLog::ini(['summer', 'test'])->info([]);// 文件名为 summer/test/yyyy-mm-dd.log, 日志内容会被转为json

Redis消息队列

基础类在: Libs/IRedis.php 队列名的配置在: config/RedisConfig.php 参考: modules/cli/queue.php

  1. lpush, 入队列
//其中参数Json: _callback是保留字段, 用于回调, 回调的处理类在RedisConfig.php中配置
//如果没有这个字段, 则不会回调
IRedis::pushQueue(redisKey, Json)
  1. brpop, 阻塞出队列
// 某一个队列, 如果没有启动过, 才会启动一个新的进程, 内部是 while true
CLI: php cli.php -q queue_blockpop_{$queue_name}

// 多个队列(推荐), 如果没有启动过, 才会启动一个新的进程, 内部是 while true
CLI: php cli.php -q queue_blockpop_all
  1. 监控pop进程, 挂掉后拉起
// 需要在cli下配合crontab或者supervisor使用
// 某个队列 crontab
* * * * * cd path/to/code && php cli.php -q queue_blockpop_{$queue_name}

// 多个队列 (推荐) crontab, 其中 queue_brpop_all 在路由中配置
* * * * * cd path/to/code && php cli.php -q queue_brpop_all
  1. restart, 如果更新代码后需要重启, 重新pop
CLI: php cli.php -q queue_restart_{redisKey}

自带登录注册模块

  • 用户信息用cookie加密存储
  • 功能有: 登录/注册/退出, 其中注册提供图形验证码

自带前端单页面应用(SPA)样例

  • 按照上边说明安装好PHP运行环境
  • 配置好数据库信息(dbConfig.php)
  • 浏览器访问首页,即是一个可查看个多主机, 数据库,表,字段等信息的web应用

安全建议

  • 尽量用post: 绝大部分的xss攻击是通过 <script> 等标签的 src 属性或href属性发起的"get"请求
  • 值中不能有\0截断符
  • 添加验证码: 防止外部构造表单请求, 要用在关键的地方(登录注册等), 不要影响到用户
  • 检测refer: 防止外部构造表单请求, 防止jsonp攻击, csrf攻击
  • 检测refer: 在返回头中构造白名单, header('Access-Control-Allow-Origin: http://www.a.com')
  • 一次性token: 用完就释放, 防止表单重复提交, 防止csrf攻击
  • include, file_get_content等使用时如果参数是URL,就得验证是否是白名单内的域名, 否则会包含/引入危险的文件
  • 对参数进行url_decode 防止 相对路径攻击(../../....)和javascript变相攻击
  • set cookie 的时候最好设置httponly, 这样就只能通过抓包来获取cookie注入脚本的方法就不行了
  • 获取cookie时限制跟ip相关, 这样通过xss的方法获取的cookie就不能被乱用了
  • html 标签可以指定本页面以后相对路径的根路径URL, 所以链接都要用全URL路径
  • 表单中过滤掉html注释符 "", 防止表单回填的时候被攻击
  • 表单中过滤掉select insert replace delete

非代码级别安全设置

  • 上传的临时文件夹不要有可执行的权限,最好用第三方存储
The MIT License (MIT) Copyright (c) 2018 myDcool Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

模块化,路由化,易调试的PHP框架。自带登录注册,Redis队列,接口验签, 数据库操作等模块;数据库支持虚拟表名,多主机读写分离,分库分表等实用功能;前端支持SPA,自研常用JS控件,常用CSS样式(flex布局为主) 展开 收起
PHP
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
PHP
1
https://gitee.com/feiman8888/SummerPHP.git
git@gitee.com:feiman8888/SummerPHP.git
feiman8888
SummerPHP
SummerPHP
master

搜索帮助

Cb406eda 1850385 E526c682 1850385