《使用php轻框架-lumen搭建api服务》

一. 源起

之前负责为一个出行类的app构建micro-service架构的后端服务。其中负责php框架技术选型的一些问题。当时的背景如下:

  1. 【坑多】第一条业务线使用ci框架,发现会中很多坑,并且后续不容易维护(变量的作用范围)。
  2. 【性能不好】php作为主要的逻辑后端,性能上希望也有较高的保证。
  3. 【耦合重,不易扩展】当时调研了silex,slim,laravel等等,最终为了实现效率还是基于自己开发的轻量级框架完成了第一版。总结回忆当时的痛点
    1)配置线上和线下多个版本的维护(需要来回切换,出现过上线后由于配置没有check到导致问题回滚的情况)
    2)mysql,memcache,log,redis的轮子都是自己造的,实际使用发现程序的健壮性不足

二. 遇见Laravel和Lumen

可能是由于c++后端的背景,之前在腾讯也是使用c++实现cgi来完成web服务。我理解上实现app后端API服务较好的框架应该是这样的

  1. 可以裁剪模块,以提升效率
  2. 更好的第三方软件的管理,类似于npm对于nodejs,pip对于python

Laravel在国外的市场份额是第一,文档全面细致,但是在中国不太流行。


《使用php轻框架-lumen搭建api服务》_第1张图片

Lumen是Laravel的裁剪版本,为了获得性能上更好的收益。

《使用php轻框架-lumen搭建api服务》_第2张图片
lumen VS silex VS slim

《使用php轻框架-lumen搭建api服务》_第3张图片
lumen VS laravel

并且,有了基于composer的laravel和lumen,我们就可以定制自己的第三方工具以来,比如:

swoole, C扩展实现的PHP异步并行网络通信框架,可以重新定义PHP。过去PHP只能做Web项目,现在有了Swoole。任意服务器端程序都可以用PHP来写。
swoole_framework,基于swoole扩展开发的一个开发框架
php-webim,基于swoole实现的Web即时聊天工具,支持websocket+http comet长链接推送,可以发送文字内容和图片
workerman,类似swoole,不过是纯PHP实现的,官网有很多示例项目。底层功能比swoole少一些,但相对简单,应用层面的功能比swoole丰富。
zephir,这个有点厉害,可以用近似PHP的一种中间代码写程序,然后自动转为C++,并作为扩展来运行。可以解决PHP语言密集计算性能差的问题。
redis-async,基于swoole扩展写的异步redis客户端,压测起来性能跟Go语言之类的差不多

《使用php轻框架-lumen搭建api服务》_第4张图片
php好的轮子们

三. 主要模块使用说明

  1. 配置管理
    lumen使用了.env文件来维护全局的最高优先级变量。变量取值.env中的优先级最高。(https://github.com/vlucas/phpdotenv) ,这个配置一般存放online的配置,在app/conf文件夹存放offline配置。并且,将.env添加到gitingore可以避免online正式环境的配置信息存放在代码中导致的安全风险

示例:读取
$dotenv = new Dotenv\Dotenv(DIR);
$dotenv->load();
$s3_bucket = getenv('S3_BUCKET');
$s3_bucket = $_ENV['S3_BUCKET'];
$s3_bucket = $_SERVER['S3_BUCKET'];

  1. 数据库
    为了获得更好的执行效率,lumen默认使用了QueryBuilder而不是基于ORM的Eloquent来与数据库通讯。其原理是提供了构建sql语句的高级语法,类似的工具如:medoo

  2. 文件系统操作
    lumen支持本地文件和云存储的读写,通过配置即可切换。


    《使用php轻框架-lumen搭建api服务》_第5张图片
    lumen文件系统支持
  3. cache
    lumen支持内存,文件,memcached,redis多种kv存储。


    《使用php轻框架-lumen搭建api服务》_第6张图片
    lumen cache服务
  4. 队列和计划任务
    一个很常见的需求就是:首次注册,希望一天后发一个提醒的消息来提升用户重复登录的行为。
    这个需求通过lumen可以很好的实现
    1)注册请求拼装好必要的job信息,填写delay时间(如:24小时)放入任务队列beanstalkd


    《使用php轻框架-lumen搭建api服务》_第7张图片
    put job入队列

    2)当job到达预定时间会进入ready队列,这时通过每分钟运行的计划任务可以执行对应的job任务(也可以使用linux自带的crontab实现)


    计划任务
  5. 使用新的composer管理的第三方组件

    《使用php轻框架-lumen搭建api服务》_第8张图片
    lumen使用到的可选的组件列表

注意:在上线之前需要优化composer的autoloader

composer dump-autoload --optimize
不加这一选项,你可能会发现20%到25%的性能损失。

四. 参考资料

  1. Laravel中文官网
  2. Laravel英文官网
  3. 电子书《Easy Laravel 5》
  4. 互联网micro service架构
  5. 使用beanstalk搭建队列服务

你可能感兴趣的:(《使用php轻框架-lumen搭建api服务》)