开源中国

我们不支持 IE 10 及以下版本浏览器

It appears you’re using an unsupported browser

为了获得更好的浏览体验,我们强烈建议您使用较新版本的 Chrome、 Firefox、 Safari 等,或者升级到最新版本的IE浏览器。 如果您使用的是 IE 11 或以上版本,请关闭“兼容性视图”。
TimoPHP首页、文档和下载 - PHP的MVC框架 - 开源中国社区
全部项目分类
BSD
PHP
跨平台
tomener
分享
收藏
48 人收藏
收录时间:2017-06-02
TimoPHP 详细介绍

TimoPHP

一个简单、快速、规范、灵活、扩展性好的PHP MVC+框架。

官网:http://www.timophp.com/

文档:http://www.timophp.com/document/

我们用TimoPHP做了哪些项目

一、异步微信推送

将推送异步化,用Redis实现的消息队列,可开启多个php守护进程来推送,不会出现多推的情况,包括单个推送和批量推送,批量推送,一次可并发推送50个,将之前老架构一次推送一个的时间从10分钟缩短到1分钟

异步发送消息例子:

FeedbackSendTask::newFeedback($this->did, $album_id, $uid, mb_substr($content, 0, 60), $phone);

就是这么简单

二、写后台守护进程

1、实现异常退出自动重启

2、支持发送信号量重启或停止,不影响正在执行的任务

重启 kill -10 进程id

3、捕获异常后重启

4、运行日志记录

5、mysql长时间连接挂掉重连

三、基于Redis的统计中间件

1、统计在线人数,5分钟一个采样点(多商家)

2、统计日、周、月使用用户数(多商家)

3、统计日、周、月【新增用户】数(多商家)

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');
        }
    }
}

我们的目标

做一个轻量级并支持大型应用开发的PHP框架

框架名称由来

原本设计的时候名称是carPHP,取名car的原因是,整个框架运行就像一辆汽车的运行过程,从点火(fireUp)到发动机(boot)启动,再到引擎(Engine)开始运作,带动各部件(components)协调工作,carphp.com被注册了,所有,再取一个名字吧,想了半天也想不出什么好名字,最后,就用Timo这个词得了。

MVC+模式

除了M层,我们还可以根据项目实际情况增加层,比如基础层(Base)业务逻辑层(Business/Logic)服务层(Service)策略层(strategy)等等

MVVC模式

把MVC模式的V(视图)分成了视图模型层和视图层(也可以说是模版层),当然,视图模型层是可选,没有的话就是经典的MVC模式

特点

1、PHP5.6+(支持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          项目配置文件
  |   |-cache                       运行时缓存目录
  |   |-[common]                    公共类库目录
  |   |   |-business                公共业务逻辑
  |   |   |-contract                约定、协议(接口)
  |   |   |-facade                  门面
  |   |   |-middleware              中间件
  |   |   |-model                   公共模型目录
  |   |   |-provider                服务提供者目录
  |   |   |-task                    异步任务
  |   |-config                      公共配置目录
  |   |-lib                         自定义组建、类库、服务等
  |   |-logs                        debug日志目录
  |   |-public                      WEB目录(对外访问目录)名称自定义,如wwwroot、public
  |   |   |-admin                   admin应用目录
  |   |   |-api
  |   |   |-m
  |   |   |_web
  |   |       |-static              静态资源目录
  |   |       |   |-css
  |   |       |   |-images
  |   |       |   |-js
  |   |       |   |_lib             js第三方库
  |   |       |_index.php           web应用入口文件
  |   |_fireUp.php                  点火,启动框架(钥匙/火花塞)
  |-TimoPHP                         框架,和项目在同一级目录
      |-cli
      |-config
      |-ext                         第三方组建目录
      |-Library
      |   |--Cache
      |   |   |--File.php
      |   |--Core
      |   |   |--Application.php
      |   |   |--Cache.php
      |   |   |--Config.php
      |   |   |--Container.php      服务容器
      |   |   |--Controller.php
      |   |   |--Db.php
      |   |   |--Engine.php         引擎
      |   |   |--Exception.php
      |   |   |--Input.php
      |   |   |--Log.php
      |   |   |--Model.php
      |   |   |--Request.php
      |   |   |--Response.php
      |   |   |--Router.php
      |   |   |--Session.php
      |   |   |__View.php
      |   |--Image
      |   |   |--Gif.php
      |   |--Session
      |   |   |--Memcached.php
      |   |   |--Redis.php
      |   |--Support
      |   |   |--ServiceProvider.php    服务提供者基类
      |   |--Auth.php
      |   |--Captcha.php
      |   |--Curl.php
      |   |--Helper.php
      |   |--Image.php
      |   |--Loader.php
      |   |--UploadFiles.php
      |   |--Validate.php
      |_boot.php                    框架启动脚本(发动机)

基本骨架

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/find/
/album/detail/
/album/questionPublish/
/album/questionFind/
/album/questionDetail/
/album/reward/
/album/rewardFind/
/album/rewardMessage/
/album/appraiseFind/

分组之后

多了三个子控制器Question.php Reward.php Appraise.php

/album/find/
/album/detail/
/album/question/publish/
/album/question/find/
/album/question/detail/
/album/reward/find/
/album/appraise/publish/
/album/appraise/find/

Redis的使用,非常有艺术感

$cache_key = BaseCache::getCacheKey('AlbumListenNumber', $did, $album_id);
$store_key = BaseCache::getCacheKey('queueCyclicIncrementId');

BaseCache::store()->set($store_key, 'TimoPHP');

BaseCache::cache()->set($cache_key, 'TimoPHP');

BaseCache::queue()->set($store_key, 'TimoPHP');

......

 

第二种目录部署

  app
    |-admin
    |-api
    |-m
    |_web
  wwwroot
    |-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

选择将代码托管在码云
你还在等什么

可能是中国最大最好的代码托管平台


大家对 TimoPHP 的评论 (全部 3 条评论)
{{repayCom.userName}}
tubexu
留个言。
tomener
比thinkphp用着爽
tomener
PHP做离线数据处理还是可以的哈!#TimoPHP#
吾字天河
为什么感觉特像thinkphp5
TimoPHP 相关博客
顶部