TimoPHP 控制器分组Redis的使用,非常有艺术感 介绍
TimoPHP
一个简单、快速、规范、灵活、扩展性好的PHP MVC+框架。
文档:http://timo.gumaor.com/document/
我们用TimoPHP做了哪些项目
将推送异步化,用Redis实现的消息队列,可开启多个PHP守护进程来推送,不会出现多推的情况,包括单个推送和批量推送,批量推送,一次可并发推送50个,将之前老架构一次推送一个的时间从10分钟缩短到1分钟
异步发送消息例子:
FeedbackSendTask::newFeedback($this->did, $album_id, $uid, mb_substr($content, 0, 60), $phone);
就是这么简单
2、支持发送信号量重启或停止,不影响正在执行的任务
重启 kill -10 进程id
3、捕获异常后重启
4、运行日志记录
5、MysqL长时间连接挂掉重连
4、统计专辑日、周、月收听量
//统计新增人数 UserMiddleware::userNewCount($did, Base::$u['uid']); //统计使用人数 UserMiddleware::userUseCount($did, Base::$u['uid']);
不需要在crontab里面定义一大堆的定时任务了
事例:控制器app/cli/controller/Cron.PHP
<?PHP namespace app\cli\controller; use common\business\cron\CountBusiness; use common\business\cron\CronBusiness; use Timo\Core\Config; use Timo\Core\Log; class Cron extends Cli { /** * 每天凌晨2:10点执行 */ public function day_2_10() { try { $countBusiness = new CountBusiness(); //增加专辑每日收听数量 $countBusiness->addAlbumDayListenNumber(); } catch (\Exception $exception) { self::errorLog($exception, 'cron/day_2_10'); } } }
我们的目标
框架名称由来
原本设计的时候名称是carPHP,取名car的原因是,整个框架运行就像一辆汽车的运行过程,从点火(fireUp)到发动机(boot)启动,再到引擎(Engine)开始运作,带动各部件(components)协调工作,carPHP.com被注册了,所有,再取一个名字吧,想了半天也想不出什么好名字,最后,就用Timo这个词得了。
MVC+模式
除了M层,我们还可以根据项目实际情况增加层,比如基础层(Base)业务逻辑层(Business/Logic)服务层(Service)策略层(strategy)等等
MVVC模式
把MVC模式的V(视图)分成了视图模型层和视图层(也可以说是模版层),当然,视图模型层是可选,没有的话就是经典的MVC模式
特点
1、PHP7+ 2、PSR标准 3、轻量级,扩展灵活 4、自定义异常处理,如404 5、原生模版解析 6、支出视图组件 7、模板支持多主题、layout(布局) 8、写app接口还是挺爽的 9、加入对cli模式支出,用来写服务、定时脚本挺好的 10、增加依赖注入服务容器,实现组件之间的松耦合 11、支持数据库读写分离设置,可具体到某张表 12、支持控制器分组路由,降低控制器复杂度 13、支持单环境和多环境配置(开发dev、测试test、线上pro)
目录结构
/data |-TimoSNS 项目目录(自己项目名称,比如用TimoPHP开发的社区应用,叫TimoSNS,自定义) | |-app 应用目录 | | |-admin 后台 | | |-api APP接口 | | |-m H5 | | |_web PC端应用 | | | |-controller 控制器目录 | | | |-[business] 复杂的业务逻辑可以存放在这里,[]表示可选,名称自定义,如business、logic等 | | | |-model 单个项目会用到的模型,公共模型放到common/model目录下面 | | | |-[service] 定义一些单个项目需要用到的底层服务(可选、可自定义名称) | | | |-template 模版目录 | | | | |-default 默认主题 | | | | | |-Index | | | | | |-Space | | | | | |-default.layer.PHP layout布局 | | | | |-win10 一个win10的扁平化主题 | | | |-[view] 视图目录,可以封装一些方法供模版中使用(可选) | | | |_config.PHP 项目配置文件 | |-business 公共业务逻辑 | |-cache 运行时缓存目录 | |-config 公共配置目录 | |-contract 约定、协议(接口) | |-facade 门面 | |-lib 自定义组建、类库、服务等 | |-logs 日志目录 | |-middleware 中间件 | |-model 公共模型目录 | |-provider 服务提供者目录 | |-public WEB目录(对外访问目录)名称自定义,如wwwroot、public | | |-admin admin应用目录 | | |-api | | |-m | | |_web | | |-static 静态资源目录 | | | |-css | | | |-images | | | |-js | | | |_lib js第三方库 | | |_index.PHP web应用入口文件 | |-task 异步任务 | |_bootstrap.PHP 点火,启动框架(钥匙/火花塞) |-TimoPHP 框架,和项目在同一级目录
基本骨架
http://git.oschina.net/tomener/timo-skeleton
参考项目
TimoPHP官网 http://www.timophp.com/
TimoSNS社区 http://git.oschina.net/tomener/TimoSNS
新建一个项目
PHP cli/tools create project_name(你要建立的项目名称,如TimoSNS)
接口返回数据
直接在Controller里面返回数组即可,可根据配置返回json、xml、html
return [];
return self::result(0, ‘ok’, []);
json例子
{ "code":1, "msg":"param error", "data":{ "id":100, "title":"TimoPHP" } }
控制器分组
当一个控制器里面包含的方法太多的时候,我们可以分组来管理,比如一个控制器包含了多个小模块
老url可能是这样,专辑控制器包含了三个小模块,分别是问题、打赏、评价,所有方法都在一个控制器里面,会很臃肿
/album/list/ /album/detail/ /album/questionPublish/ /album/questionList/ /album/questionDetail/ /album/reward/ /album/rewardList/ /album/rewardMessage/ /album/appraiseList/
分组之后
多了三个子控制器Question.PHP Reward.PHP Appraise.PHP
/album/list/ /album/detail/ /album/question/publish/ /album/question/list/ /album/question/detail/ /album/reward/list/ /album/appraise/publish/ /album/appraise/list/
Redis的使用,非常有艺术感
$cache_key = CacaeLib::getCacheKey('AlbumListenNumber', $did, $album_id); $store_key = CacaeLib::getCacheKey('queueCyclicIncrementId'); CacaeLib::store()->set($store_key, 'TimoPHP'); CacaeLib::cache()->set($cache_key, 'TimoPHP'); ......
第二种目录部署
app |-admin |-api |-m |_web public |-admin | |-static | |-index.PHP |-api |-m |-static | |-css | |-images | |-js | |_lib |-.htaccess |-favicon.ico |-index.PHP
访问方式:
web下面的 1、http://www.timoPHP.com/index/index 2、http://www.timoPHP.com/blog/show/10001 admin下面的 1、http://www.timoPHP.com/admin/index/index 2、http://www.timoPHP.com/admin/user/detail/10008 api、m和admin一样
TimoPHP 控制器分组Redis的使用,非常有艺术感 官网
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。