之前我说过一次Lumen这个微框架,随着Laravel的LTS版释出,Lumen也自然而然的升到了5.1.x,和刚刚开始又有点不同了……
关于Facade
Lumen和Laravel很像,但是又有些许不同。在你安装完成后,“Facades”默认是不启用的,也就是说Cache::read()啊DB::select()这样的Facade类就不能用了,要用怎么办呢?在bootstrap/app.php里将$app->withFacades()
的注释去掉就可以了。
但是有个问题,打开Facade后,我本地用ab -c 100 -n 100
跑了一下,Time per request(mean)
比不打开的状态要多花60ms左右,虽然平均到每个连接基本没啥影响,但既然用了微框架,不就是要快么~ 大概Lumen也是因为这个默认禁用了这个特性吧。
不用Facade又想使用这些个好东西该怎么办呢,有个很简单的方法,使用app()
辅助方法。
比如说,原来是这么写的
use Cache;
Cache::put('key', 'value', 30);
现在要这么用
app('cache')->put('key', 'value', 30);
当然,你可以把app('cache')
保存下来,或者直接Controller初始化的时候就备好,以后只要$this->cache
就能调用,也不麻烦什么。
其他的像Redis
,Session
啥的都可以这么做(哦,默认Lumen中Session也是不启用的)。
使用DB的时候,稍稍有些不同,不能简单的使用,因为默认情况下,Lumen并没有启用Eloquent,所以首先你得在app.php中将$app->withEloquent()
打开,然后加一句$app->alias('db', 'Illuminate\Database\DatabaseManager')
,嗯……还有点点儿麻烦,不过一劳永逸。
还有一个方法,Lumen的文档中也说到了,可以用依赖注入,这我就不多说(主要是我记不得Cache到底是哪个类,还是用app的方法,和Laravel更一致些)。
Redis
Lumen中配置可以用Redis,实际上你用的时候会报错
Fatal error: Class ‘Illuminate\Redis\RedisServiceProvider’ not found in /home/vagrant/lumen/vendor/laravel/lumen-framework/src/Application on line 219
想要用么?请执行
composer require illuminate/redis
.env
一开始用的时候,出错了老是不在页面打开错误堆栈,只能去storage/logs里去看,我的.env中APP_DEBUG已经设置为了true,还以为Lumen把页面报错的功能也阉割了。后来在使用Cache的过程中,报Memcached没有找到,才发现哪里不对,我在.env中并没有设置memcached作为缓存引擎。一试env('CACHE_DRIVER')
什么都没有,于是立马再打开app.php,发现原来加载.env文件的功能都被注释了……就在一开始的地方:
// Dotenv::load(__DIR__.'/../');
但是不得不说,打开了这个选项,又慢了20ms左右,所以直接修改vendor/laravel/lumen-framework/config是个不错的主意,也可以把这个文件夹拷贝出来放到app下面,Lumen会读取的。开发阶段,先用用.env吧,以后定了直接改config。
2015.10.01更新
Lumen 5.1以后,DB可以直接使用app(‘db’)调用,不需要上面这么麻烦了。
使用PHPRedis代替Predis
2015.10.10更新
为什么使用Lumen?还不是为了两个字“速度”!Lumen自然很快,redis也很快。然而phpredis相对来说,predis不够快,predis是使用php写的,phpredis则是C语言写的原生模块,差距也是显而易见的。按照上面的描述,安装了illuminate/redis
可以使用Redis,不过默认使用的是Predis,Lumen或者说Laravel原生的并不支持phpredis。
怎么办呢?经过一番研究,终于完成了这个改造(其实得益于phpredis和predis的兼容性,两者很多时候用法是一样的)。在bootstrap/app.php中加入如下语句:
$app->singleton('redis', function(){
$redis = new Redis;
$redis->pconnect('127.0.0.1');
return $redis;
});
unset($app->availableBindings['redis']);
当然,’127.0.0.1’可以不是写死的,用config或者env来获得,这个就不用教了吧。而后app(‘redis’)就能得到原生的连接速度啦。这里要注意的是availableBindings这个东西,我先前只运行了singleton,怎么跑还是错的,跟踪进去以后才发现Lumen还要看availableBindings和ranServiceBinders两个变量,许是为了速度吧?ranServiceBinders是protected的,只能修改availableBindings了。
持续更新中……
最近也使用Lumen开发服务端,确实遇到一些坑,赞一个
Thank you ~
不知道PHPRedis和Predis在使用的时候性能差距有多明显?
没有找到.env,请问这个在哪里呢?
.env.sample重命名,如果没…我们玩的是同一个东西吗?
直接修改vendor/laravel/lumen-framework/config是个不错的主意???
之所以安装illuminate/redis,是因为这个ServiceProvider提供了redis的封装,在lumen里直接在app.php中添加一行:
$app->register(Illuminate\Redis\RedisServiceProvider::class);
就可以直接使用redis了。
非常感谢作者的分享