使用 Composer 搭建适合自己项目的微框架

Micro Framework

介绍

公司重调组织架构后,我们小组被规划为<基础服务组>,主要工作内容是提供独立的微服务供别人调用。诸如,发送短信服务、垃圾过滤服务、心跳监测服务、异常捕获服务等。这些微服务提供少量接口,有些甚至不需要数据层和缓存层。这时候使用Lumen都显得臃肿更别提Laravel了。而且线上环境强制使用composer国外源,一次简单升级就要耗费一上午时间。看过一些轻量级框架,对比选择后,还是觉得Slim用起来顺手点。有关Slim各种吹逼的介绍及特性在这里就不细说了,毕竟,每个框架都说自己是最牛逼的。鲁迅说,没有最好的框架,只有最适合业务场景的框架(老子没说过这句话.jpg)。微框架使用Slim核心组件并配合其它包组合而成,使用过程中可以自由组合自己熟悉的composer包。

Composer包

安装

1. git clone -b master git@github.com:moext/moant.git
2. cd moant/
3. composer install -vvv
4. composer dump-autoload -o
5. cp .env.example .env

使用

路由

所有路由都定义在route目录下的api.php文件里。示例:

use App\Controllers\TestController;
$app->any('/', TestController::class . ':test');

如上,定义路由用到控制器的时候,需要先把控制器类引入。

配置

.env文件中配置连接mysql和redis。新建test数据库,在库中新建users表,插入几条测试数据。

# 新建数据库
create database test;

# 新建表
use test;
CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

# 插入数据
INSERT INTO `users` (`id`, `username`, `password`)
VALUES
    (1, '张三', '123'),
    (2, '李四', '456');

示例

<?php

namespace App\Controllers;

use App\Services\DB;
use Slim\Http\Request;
use App\Services\Redis;
use Slim\Http\Response;
use App\Services\Logger;

class TestController
{
    public function test(Request $request, Response $response)
    {
        $db = DB::getInstance();
        $arrUser = $db->select('users', ['username']);

        $redis = Redis::getInstance();
        $redis->setex('redis_key', 3600, json_encode($arrUser));

        Logger::add('name', [$request->getUri(), $request->getMethod(), $response->withJson('logger record success!')]);

        echo '<h1 style="text-align: center; margin-top: 200px">';
        echo 'Micro Framework';
        echo '</h1>';
    }
}

进入moant\public目录,执行php -S localhost:8080,在浏览器访问localhost:8080,页面会显示Micro Framework。同时,将DB查询出的数据保存到redis并把这次请求的输入输出在日志文件记录。

通用方法

support目录下的helper.php文件里定义一些通用函数。

ab压测对比(仅供参考)

最近把小框架完善了下,并用它和Lumen做了次压测对比。压测数据不具说服力,仅供参考。使用同样的方式,通过路由找到控制器然后在方法里输出一串字符。

电脑配置
file

Lumen压测图如下:
file

Slim-Framework压测图如下:
file

欢迎Star、提Issue

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 6年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 6

既然是微框架,那么目的也就是为了写接口,建议用上Swagger自动输出文档http://phpboot.org/zh/latest/advanced/docgen.html#swagger

6年前 评论

没理解为什么强制使用外国源,外国源香吗。。。

6年前 评论

@839891627 因为我们的项目用到很多自己开发的composer包,如果composer包出现bug,修改之后发布到packagist上面,使用国内源有一个缓存时间,不能及时修复问题。

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!