一. 源起
之前负责为一个出行类的app构建micro-service架构的后端服务。其中负责php框架技术选型的一些问题。当时的背景如下:
- 【坑多】第一条业务线使用ci框架,发现会中很多坑,并且后续不容易维护(变量的作用范围)。
- 【性能不好】php作为主要的逻辑后端,性能上希望也有较高的保证。
- 【耦合重,不易扩展】当时调研了silex,slim,laravel等等,最终为了实现效率还是基于自己开发的轻量级框架完成了第一版。总结回忆当时的痛点
1)配置线上和线下多个版本的维护(需要来回切换,出现过上线后由于配置没有check到导致问题回滚的情况)
2)mysql,memcache,log,redis的轮子都是自己造的,实际使用发现程序的健壮性不足
二. 遇见Laravel和Lumen
可能是由于c++后端的背景,之前在腾讯也是使用c++实现cgi来完成web服务。我理解上实现app后端API服务较好的框架应该是这样的
- 可以裁剪模块,以提升效率
- 更好的第三方软件的管理,类似于npm对于nodejs,pip对于python
Laravel在国外的市场份额是第一,文档全面细致,但是在中国不太流行。
Lumen是Laravel的裁剪版本,为了获得性能上更好的收益。
lumen VS silex VS slimlumen VS laravel
并且,有了基于composer的laravel和lumen,我们就可以定制自己的第三方工具以来,比如:
php好的轮子们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语言之类的差不多
三. 主要模块使用说明
- 配置管理
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'];
-
数据库
为了获得更好的执行效率,lumen默认使用了QueryBuilder而不是基于ORM的Eloquent来与数据库通讯。其原理是提供了构建sql语句的高级语法,类似的工具如:medoo -
文件系统操作
lumen支持本地文件和云存储的读写,通过配置即可切换。
lumen文件系统支持 -
cache
lumen支持内存,文件,memcached,redis多种kv存储。
lumen cache服务 -
队列和计划任务
一个很常见的需求就是:首次注册,希望一天后发一个提醒的消息来提升用户重复登录的行为。
这个需求通过lumen可以很好的实现
1)注册请求拼装好必要的job信息,填写delay时间(如:24小时)放入任务队列beanstalkd
put job入队列
2)当job到达预定时间会进入ready队列,这时通过每分钟运行的计划任务可以执行对应的job任务(也可以使用linux自带的crontab实现)
计划任务 -
使用新的composer管理的第三方组件
lumen使用到的可选的组件列表
注意:在上线之前需要优化composer的autoloader
composer dump-autoload --optimize
不加这一选项,你可能会发现20%到25%的性能损失。
四. 参考资料
网友评论
FPM下的PHP 性能仍是问题,我在尝试结合Swoole来常驻内存,已有成品 LaravelS
https://github.com/hhxsv5/laravel-s
推荐下,分布式作业中间件 Elastic-Job 源码解析 16 篇:http://tinyurl.com/y93r9wfg
瑁