Laravel:使用内存缓存而不是文件系统
Laravel: Use Memcache instead of Filesystem
每当我加载页面时,我都可以看到 Laravel 从 /storage 文件夹中读取大量数据。
一般来说,动态读写我们的文件系统是一个瓶颈。我们正在使用 Google App Engine,我们的存储在 Google Cloud Storage 中,这意味着一次写入或读取等于一次 "remote" API 请求。 Google Cloud Storage 很快,但我觉得它很慢,因为 Laravel 每个请求调用 10-20 个 Cloud Storage。
是否可以将数据存储在内存缓存中而不是在/storage 目录中?我相信这会给我们的系统带来更好的性能。
注意。 Session 和 Cache 都使用 Memcache,但编译后的视图和元数据存储在文件系统上。
为了将编译后的视图存储在 Memcache 中,您需要替换 Blade 编译器 使用的存储。
首先,您需要一个扩展 Illuminate\Filesystem\Filesystem 的新存储 class。下面列出了 BladeCompiler 使用的方法 - 您需要让它们使用 Memcache。
- 存在
- lastModified
- 得到
- 放
此 class 的草稿如下,您可能希望使其更复杂:
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:
中添加内存缓存配置
'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);
});
这应该可以解决问题。
如果您发现拼写错误或错误,请告诉我,我还没有机会运行。
每当我加载页面时,我都可以看到 Laravel 从 /storage 文件夹中读取大量数据。
一般来说,动态读写我们的文件系统是一个瓶颈。我们正在使用 Google App Engine,我们的存储在 Google Cloud Storage 中,这意味着一次写入或读取等于一次 "remote" API 请求。 Google Cloud Storage 很快,但我觉得它很慢,因为 Laravel 每个请求调用 10-20 个 Cloud Storage。
是否可以将数据存储在内存缓存中而不是在/storage 目录中?我相信这会给我们的系统带来更好的性能。
注意。 Session 和 Cache 都使用 Memcache,但编译后的视图和元数据存储在文件系统上。
为了将编译后的视图存储在 Memcache 中,您需要替换 Blade 编译器 使用的存储。
首先,您需要一个扩展 Illuminate\Filesystem\Filesystem 的新存储 class。下面列出了 BladeCompiler 使用的方法 - 您需要让它们使用 Memcache。
- 存在
- lastModified
- 得到
- 放
此 class 的草稿如下,您可能希望使其更复杂:
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:
中添加内存缓存配置'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);
});
这应该可以解决问题。
如果您发现拼写错误或错误,请告诉我,我还没有机会运行。