继续折腾Lumen

By | 2015/09/27

之前我说过一次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就能调用,也不麻烦什么。

其他的像RedisSession啥的都可以这么做(哦,默认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了。

持续更新中……

8 thoughts on “继续折腾Lumen

  1. sun

    最近也使用Lumen开发服务端,确实遇到一些坑,赞一个

    Reply
  2. 哈哈

    没有找到.env,请问这个在哪里呢?

    Reply
    1. xishui Post author

      .env.sample重命名,如果没…我们玩的是同一个东西吗?

      Reply
  3. abel

    直接修改vendor/laravel/lumen-framework/config是个不错的主意???

    Reply
  4. abel

    之所以安装illuminate/redis,是因为这个ServiceProvider提供了redis的封装,在lumen里直接在app.php中添加一行:

    $app->register(Illuminate\Redis\RedisServiceProvider::class);

    就可以直接使用redis了。

    Reply

发表评论

您的电子邮箱地址不会被公开。