laravel 框架memcache的配置

Laravel5框架在Cache和Session中不支持Memcache,看清了是Memcache而不是Memcached哦,MemCached是支持的但是这个扩展真的是装的蛋疼,只有修改部分源码让其来支持memcache了。具体修改部分如下:

找到sessioni管理器 Laravel\vendor/laravel/framework/src/Illuminate/Session/SessionManager.php,并增加如下代码:

/**
     * Create an instance of the Memcached session driver.
     *
     * @return IlluminateSessionStore
     */
    protected function createMemcacheDriver()
    {
        return $this->createCacheBased(‘memcache‘);
    }

接下来修改cache部分,找到Laravel/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php
在该文件中增加以下代码:

/**
     * Create an instance of the Memcache cache driver.
     *
     * @return IlluminateCacheMemcachedStore
     */
    protected function createMemcacheDriver(array $config)
    {
        $prefix = $this->getPrefix($config);

        $memcache = $this->app[‘memcache.connector‘]->connect($config[‘servers‘]);

        return $this->repository(new MemcacheStore($memcache, $prefix));
    }

接下来找到文件: Laravel/vendor/laravel/framework/src/Illuminate/Cache/CacheServiceProvider.php 将memcache注册进去
修改如下:

/**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton(‘cache‘, function ($app) {
            return new CacheManager($app);
        });

        $this->app->singleton(‘cache.store‘, function ($app) {
            return $app[‘cache‘]->driver();
        });

        $this->app->singleton(‘memcached.connector‘, function () {
            return new MemcachedConnector;
        });

        $this->app->singleton(‘memcache.connector‘,function() {       // 这里返回了MemcacheConnector,记得在Cache目录下创建这个class
            return new MemcacheConnector;
        });
        $this->registerCommands();
    }

/**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return [
            ‘cache‘, ‘cache.store‘, ‘memcached.connector‘, ‘command.cache.clear‘,‘memcache.connector‘
        ];
    }

我们看到这个闭包函数中返回了MemcacheContector的对象,现在来创建此类。文件位置:Laravel/vendor/laravel/framework/src/Illuminate/Cache/MemcacheConnector.php

<?php
namespace Illuminate\Cache;

use Memcache;
use RuntimeException;

class MemcacheConnector {

    /**
     * Create a new Memcached connection.
     *
     * @param array  $servers
     * @return Memcache
     */
    public function connect(array $servers)
    {
        $memcache = $this->getMemcache();

        // For each server in the array, we‘ll just extract the configuration and add
        // the server to the Memcache connection. Once we have added all of these
        // servers we‘ll verify the connection is successful and return it back.
        foreach ($servers as $server)
        {
            $memcache->addServer($server[‘host‘], $server[‘port‘], $server[‘weight‘]);
        }

        if ($memcache->getVersion() === false)
        {
            throw new RuntimeException("Could not establish Memcache connection.");
        }

        return $memcache;
    }

    /**
     * Get a new Memcache instance.
     *
     * @return Memcached
     */
    protected function getMemcache()
    {
        return new Memcache;
    }
}

按照第二步的流程这个文件会执行connect的方法,执行完成之后返回一个Memcache的对象, 这时候第二步那里根据这边来创建了一个MemcacheStore的存储器。

文件地址:Laravel/vendor/laravel/framework/src/Illuminate/Cache/MemcacheStore.php

<?php

namespace Illuminate\Cache;

use Memcache;
use Illuminate\Contracts\Cache\Store;

class MemcacheStore extends TaggableStore implements Store
{
    /**
     * The Memcached instance.
     *
     * @var \Memcached
     */
    protected $memcached;

    /**
     * A string that should be prepended to keys.
     *
     * @var string
     */
    protected $prefix;

    public function __construct(Memcache $memcache, $prefix = ‘‘)
    {
        $this->memcache = $memcache;
        $this->prefix = strlen($prefix) > 0 ? $prefix.‘:‘ : ‘‘;
    }

    /**
     * Retrieve an item from the cache by key.
     *
     * @param  string|array  $key
     * @return mixed
     */
    public function get($key)
    {
        return $this->memcache->get($this->prefix.$key);
    }

    /**
     * Retrieve multiple items from the cache by key.
     *
     * Items not found in the cache will have a null value.
     *
     * @param  array  $keys
     * @return array
     */
    public function many(array $keys)
    {
        $prefixedKeys = array_map(function ($key) {
            return $this->prefix.$key;
        }, $keys);

        $values = $this->memcache->getMulti($prefixedKeys, null, Memcache::GET_PRESERVE_ORDER);

        if ($this->memcache->getResultCode() != 0) {
            return array_fill_keys($keys, null);
        }

        return array_combine($keys, $values);
    }

    /**
     * Store an item in the cache for a given number of minutes.
     *
     * @param  string  $key
     * @param  mixed   $value
     * @param  int     $minutes
     * @return void
     */
    public function put($key, $value, $minutes)
    {
        $compress = is_bool($value) || is_int($value) || is_float($value) ? false : MEMCACHE_COMPRESSED;
        $this->memcache->set($this->prefix.$key, $value, $compress, $minutes * 60);
    }

    /**
     * Store multiple items in the cache for a given number of minutes.
     *
     * @param  array  $values
     * @param  int  $minutes
     * @return void
     */
    public function putMany(array $values, $minutes)
    {
        $prefixedValues = [];

        foreach ($values as $key => $value) {
            $prefixedValues[$this->prefix.$key] = $value;
        }

        $this->memcache->setMulti($prefixedValues, $minutes * 60);
    }
     /**
     * Store an item in the cache if the key doesn‘t exist.
     *
     * @param  string  $key
     * @param  mixed   $value
     * @param  int     $minutes
     * @return bool
     */
    public function add($key, $value, $minutes)
    {
        return $this->memcache->add($this->prefix.$key, $value, $minutes * 60);
    }

    /**
     * Increment the value of an item in the cache.
     *
     * @param  string  $key
     * @param  mixed   $value
     * @return int|bool
     */
    public function increment($key, $value = 1)
    {
        return $this->memcache->increment($this->prefix.$key, $value);
    }

    /**
     * Decrement the value of an item in the cache.
     *
     * @param  string  $key
     * @param  mixed   $value
     * @return int|bool
     */
    public function decrement($key, $value = 1)
    {
        return $this->memcache->decrement($this->prefix.$key, $value);
    }

    /**
     * Store an item in the cache indefinitely.
     *
     * @param  string  $key
     * @param  mixed   $value
     * @return void
     */
    public function forever($key, $value)
    {
        $this->put($key, $value, 0);
    }

    /**
     * Remove an item from the cache.
     *
     * @param  string  $key
     * @return bool
     */
    public function forget($key)
    {
        return $this->memcache->delete($this->prefix.$key);
    }

    /**
     * Remove all items from the cache.
     *
     * @return void
     */
    public function flush()
    {
        $this->memcache->flush();
    }

    /**
     * Get the underlying Memcached connection.
     *
     * @return \Memcached
     */
    public function getMemcached()
    {
        return $this->memcache;
    }

    /**
     * Get the cache key prefix.
     *
     * @return string
     */
    public function getPrefix()
    {
        return $this->prefix;
    }

    /**
     * Set the cache key prefix.
     *
     * @param  string  $prefix
     * @return void
     */
    public function setPrefix($prefix)
    {
        $this->prefix = ! empty($prefix) ? $prefix.‘:‘ : ‘‘;
    }
}

上述步骤操作完成后,接下来修改一下config.php中的驱动部分,增加如下代码段:

// 修改为memcached
‘default‘ => env(‘CACHE_DRIVER‘, ‘memcache‘),

// stores 部分增加memcache配置
‘memcache‘ => [
    ‘driver‘  => ‘memcache‘,
    ‘servers‘ => [
        [
            ‘host‘ => env(‘MEMCACHED_HOST‘, ‘127.0.0.1‘),
            ‘port‘ => env(‘MEMCACHED_PORT‘, 11211),
            ‘weight‘ => 100,
        ],
    ],
],

至此完工,尽情享用吧。

时间: 2024-08-10 15:08:58

laravel 框架memcache的配置的相关文章

Laravel框架的一些配置

服务器的配置 1.在apache下的配置 配置httpd-conf:php5_module.rewrite_module.Listen 配置extra/httpd-vhost:端口.站点.域名.默认首页 系统hosts:将域名指向本地 重启apache linux下记得修改文件夹权限:storage.vendor 2.在nginx下的配置 配置nginx.conf:端口.站点.域名.默认首页 FastCgi location ~ \.php$ { fastcgi_pass 127.0.0.1:9

CentOS 7 下配置 Nginx + PHP7.1 + MariaDB 以及 Laravel 框架

html { } .CodeMirror { height: auto } .CodeMirror-scroll { } .CodeMirror-lines { padding: 4px 0px } .CodeMirror pre { } .CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler { background-color: white } .CodeMirror-gutters { border-right-width: 1px;

php后台开发(二)Laravel框架

php后台开发(二)Laravel框架 为了提高后台的开发效率,往往需要选择一套适合自己的开发框架,因此,选择了功能比较完善的Laravel框架,仔细学来,感觉和Python语言的框架Django非常类似. Laravel框架 Laravel是一套web应用开发框架,它具有富于表达性且简洁的语法,并提供了验证(authentication).路由(routing).session和缓存(caching)等开发过程中经常用到的工具或功能. 框架安装 安装composer http://docs.p

Laravel框架学习 -- 安装

环境:mac os  10.10.5; php 5.6.9; 文档参考: http://www.golaravel.com/ 包管理: python  一般使用 pip Laravel 利用 Composer(Composer 中文)来管理其自身的依赖包. 安装: [email protected]:/Users/lpe234  $ brew tap josegonzalez/homebrew-php Warning: Already tapped! [email protected]:/Use

PHP框架——TP_0001----ThinkPHP常用配置

ThinkPHP惯例配置讲解 分类:PHP 时间:2015年8月18日 ThinkPHP框架是国人开发的优秀PHP框架之一,ThinkPHP文档还有代码注释都是中文的,学习起来非常的顺手.下面主要介绍下ThinkPHP惯例配置讲解(ThinkPHP\Conf\convention.php)框架默认的设置,包括应用相关的配置.PHP cookie和session的设置.ThinkPHP的框架自己的配置.数据库连接和数据缓存配置.日志设置.错误模板的配置.模板引擎的配置和布局的设置.模板标签和系统变

[麦先生]初学Laravel框架与ThinkPHP框架的不同(2)

在经过了一段时间的开发后,我对Laravel框架的认识又在逐步的加深,对于这个世界占有量NO.1的框架...  我想说,我已经在逐步的感受到他的恐怖之处... 一.建表--Laravel在数据库建表上有自己独立内置的结构,可以完全不用借助原生SQL语句或者SQLyogEnt.Navicat 这样的建表工具,进行数据库的建立,增删改查,和数据交互;我想这可能是它牢牢占据NO.1的一大靓点;在ThinkPHP中则需要我们借助SQL语句或者建表工具去逐步完善数据 1.首先我们需要建立模型:我用的是gi

Laravel框架学习(四)

一. composer的安装: 1.Composer是什么? 是 PHP 用来管理依赖(dependency)关系的工具. 你可以在自己的项目中声明所依赖的外部工具库(libraries), Composer 会帮你安装这些依赖的库文件. 2.网址:https://getcomposer.org 下载:https://getcomposer.org/download/ 中国全量镜像:http://pkg.phpcomposer.com/ 启用本镜像服务命令: composer config -g

php的laravel框架快速集成微信登录

最终的解决方案是:https://github.com/liuyunzhuge/php_weixin_provider,详细的介绍请往下阅读. 本文面向的是php语言laravel框架的用户,介绍的是基于该框架实现的一个简易集成微信登录的方法.使用方法如下: 1. 安装php_weixin_provider 在项目下运行composer require thirdproviders/weixin,即可完成安装.安装成功后,在项目的vendor目录下应该能看到php_weixin_provider

laravel框架学习(二)

在了解Laravel框架的基本结构之后,初步认识访问过程中路由的使用方法,以一套基本的学生信息增删改查来迅速学习框架开发. 首先了解几个目录文件作为开发的主要阵地: 1. /app/Http/routes.php 路由文件,一切访问从路由开始 2./app/Http/Controllers 控制器目录,我们写的控制器都放在该目录下 3./app/config Laravel配置文件夹一般修改.env文件 4./.env 经常修改配置的文件,数据库配置就在这里 5./public Laravel框