每当我加载页面时,我都可以看到Laravel从/ storage文件夹中读取大量数据。
一般来说,动态读取和写入我们的文件系统是一个瓶颈。我们正在使用Google App Engine,而我们的存储位于Google云端存储中,这意味着一次写入或读取等同于“远程”#34; API请求。谷歌云存储速度很快,但我感觉它很慢,因为Laravel每个请求最多可以拨打10-20个云端存储空间。
是否可以将数据存储在Memcache中而不是/ storage目录中?我相信这会给我们的系统带来更好的性能。
NB。 Session和Cache都使用Memcache,但编译的视图和meta存储在文件系统中。
答案 0 :(得分:4)
要在 Memcache 中存储已编译的视图,您需要替换 Blade编译器使用的存储。
首先,您需要一个扩展 Illuminate \ Filesystem \ Filesystem 的新存储类。 BladeCompiler 使用的方法如下所示 - 您需要使用Memcache。
此类的草稿如下,您可能希望使其更复杂:
class MemcacheStorage extends Illuminate\Filesystem\Filesystem {
protected $memcached;
public function __construct() {
$this->memcached = new Memcached();
$this->memcached->addServer(Config::get('view.memcached_host'), Config::get('view.memcached_port');
}
public function exists($key) {
return !empty($this->get($key));
}
public function get($key) {
$value = $this->memcached->get($key);
return $value ? $value['content'] : null;
}
public function put($key, $value) {
return $this->memcached->set($key, ['content' => $value, 'modified' => time()]);
}
public function lastModified($key) {
$value = $this->memcached->get($key);
return $value ? $value['modified'] : null;
}
}
第二件事是在 config / view.php 中添加memcache配置:
'memcached_host' => 'localhost',
'memcached_port' => 11211
您需要做的最后一件事是在您的某个服务提供商中覆盖 blade.compiler 服务,以便它使用您全新的memcached存储:
$app->singleton('blade.compiler', function ($app) {
$cache = $app['config']['view.compiled'];
$storage = $app->make(MemcacheStorage::class);
return new BladeCompiler($storage, $cache);
});
这应该可以解决问题。
如果你看到一些拼写错误或错误,请告诉我,没有机会运行它。