美文网首页OpenAPI程序员Laravel开发实践
《使用php轻框架-lumen搭建api服务》

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

作者: skywalker | 来源:发表于2015-12-22 20:58 被阅读16318次

    一. 源起

    之前负责为一个出行类的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在国外的市场份额是第一,文档全面细致,但是在中国不太流行。


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

    lumen VS silex VS slim
    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好的轮子们

    三. 主要模块使用说明

    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支持本地文件和云存储的读写,通过配置即可切换。


      lumen文件系统支持
    3. cache
      lumen支持内存,文件,memcached,redis多种kv存储。


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


      put job入队列

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


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

      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服务》

      本文链接:https://www.haomeiwen.com/subject/kjtlcttx.html