Laravel:使用Memcache而不是Filesystem

时间:2015-07-18 00:51:04

标签: php google-app-engine laravel laravel-4 google-cloud-storage

每当我加载页面时,我都可以看到Laravel从/ storage文件夹中读取大量数据。

一般来说,动态读取和写入我们的文件系统是一个瓶颈。我们正在使用Google App Engine,而我们的存储位于Google云端存储中,这意味着一次写入或读取等同于“远程”#34; API请求。谷歌云存储速度很快,但我感觉它很慢,因为Laravel每个请求最多可以拨打10-20个云端存储空间。

是否可以将数据存储在Memcache中而不是/ storage目录中?我相信这会给我们的系统带来更好的性能。

NB。 Session和Cache都使用Memcache,但编译的视图和meta存储在文件系统中。

1 个答案:

答案 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);
});

这应该可以解决问题。

如果你看到一些拼写错误或错误,请告诉我,没有机会运行它。