>  기사  >  php教程  >  SmartWiki, Laravel 캐싱 확장 기능 개발

SmartWiki, Laravel 캐싱 확장 기능 개발

高洛峰
高洛峰원래의
2016-12-02 16:39:511082검색

SmartWiki 데모 사이트는 Alibaba Cloud에 배포되기 때문에 Alibaba Cloud에는 128M의 무료 Memcache 서비스가 있습니다. Memcached 구성 방법에 따라 구성한 후 Laravel에서 오류를 보고한 것을 확인했는데 오류 위치는 다음과 같습니다. addServer에 오류가 있어 Alibaba Cloud의 Memcache에 연결할 수 없습니다.

무기력해서 알리바바 클라우드 설치 매뉴얼에 스크립트를 써서 서버에 올려두니 접속해서 쓸 수 있었어요.

Alibaba Cloud에서 제공하는 스크립트는 다음과 같습니다.

<?php
$connect = new Memcached;  //声明一个新的memcached链接
$connect->setOption(Memcached::OPT_COMPRESSION, false); //关闭压缩功能
$connect->setOption(Memcached::OPT_BINARY_PROTOCOL, true); //使用binary二进制协议
$connect->addServer(&#39;00000000.ocs.aliyuncs.com&#39;, 11211); //添加OCS实例地址及端口号
//$connect->setSaslAuthData(&#39;aaaaaaaaaa, &#39;password&#39;); //设置OCS帐号密码进行鉴权,如已开启免密码功能,则无需此步骤
$connect->set("hello", "world");
echo &#39;hello: &#39;,$connect->get("hello");
print_r( $connect->getVersion());
$connect->quit();

laravel의 Memcached 드라이버를 살펴보고 /vendor/laravel/framework/src/Illuminate/Cache/MemcachedConnector에 Memcached 객체를 생성합니다. .php 코드는 다음과 같습니다.

public function connect(array $servers)
{
    $memcached = $this->getMemcached();
    // For each server in the array, we&#39;ll just extract the configuration and add
    // the server to the Memcached connection. Once we have added all of these
    // servers we&#39;ll verify the connection is successful and return it back.
    foreach ($servers as $server) {
        $memcached->addServer(
            $server[&#39;host&#39;], $server[&#39;port&#39;], $server[&#39;weight&#39;]
        );
    }
    $memcachedStatus = $memcached->getVersion();
    if (! is_array($memcachedStatus)) {
        throw new RuntimeException(&#39;No Memcached servers added.&#39;);
    }
    if (in_array(&#39;255.255.255&#39;, $memcachedStatus) && count(array_unique($memcachedStatus)) === 1) {
        throw new RuntimeException(&#39;Could not establish Memcached connection.&#39;);
    }
    return $memcached;
}

laravel의 Memcached에서는 가장 간단한 연결 설정만 포함하고 getVersion을 호출하여 설정 여부를 테스트합니다. 연결되었습니다. Alibaba Cloud의 데모 코드는 압축을 끄고 바이너리 바이너리 프로토콜을 사용하는 옵션을 설정합니다.

커스텀 옵션을 구현하려면 Memcached의 기능을 확장하는 수밖에 없습니다. laravel의 확장 캐시는 Cache::extend를 사용하여 확장할 수 있습니다. 확장 코드는 다음과 같습니다.

Cache::extend(&#39;MemcachedExtend&#39;, function ($app) {

    $memcached = $this->createMemcached($app);

    // 从配置文件中读取缓存前缀
    $prefix = $app[&#39;config&#39;][&#39;cache.prefix&#39;];

    // 创建 MemcachedStore 对象
    $store = new MemcachedStore($memcached, $prefix);

    // 创建 Repository 对象,并返回
    return new Repository($store);
});
/**
 * 创建Memcached对象
 * @param $app
 * @return mixed
 */
protected function createMemcached($app)
{
    // 从配置文件中读取 Memcached 服务器配置
    $servers = $app[&#39;config&#39;][&#39;cache.stores.MemcachedExtend.servers&#39;];


    // 利用 Illuminate\Cache\MemcachedConnector 类来创建新的 Memcached 对象
    $memcached = new \Memcached;

    foreach ($servers as $server) {
        $memcached->addServer(
            $server[&#39;host&#39;], $server[&#39;port&#39;], $server[&#39;weight&#39;]
        );
    }

    // 如果服务器上的 PHP Memcached 扩展支持 SASL 认证
    if (ini_get(&#39;memcached.use_sasl&#39;) && isset($app[&#39;config&#39;][&#39;cache.storess.MemcachedExtend.memcached_user&#39;]) && isset($app[&#39;config&#39;][&#39;cache.storess.MemcachedExtend.memcached_pass&#39;])) {

        // 从配置文件中读取 sasl 认证用户名
        $user = $app[&#39;config&#39;][&#39;cache.storess.MemcachedExtend.memcached_user&#39;];

        // 从配置文件中读取 sasl 认证密码
        $pass = $app[&#39;config&#39;][&#39;cache.storess.MemcachedExtend.memcached_pass&#39;];

        // 指定用于 sasl 认证的账号密码
        $memcached->setSaslAuthData($user, $pass);
    }

    //扩展
    if (isset($app[&#39;config&#39;][&#39;cache.stores.MemcachedExtend.options&#39;])) {
        foreach ($app[&#39;config&#39;][&#39;cache.stores.MemcachedExtend.options&#39;] as $key => $option) {
            $memcached->setOption($key, $option);
        }
    }
    $memcachedStatus = $memcached->getVersion();

    if (! is_array($memcachedStatus)) {
        throw new RuntimeException(&#39;No Memcached servers added.&#39;);
    }

    if (in_array(&#39;255.255.255&#39;, $memcachedStatus) && count(array_unique($memcachedStatus)) === 1) {
        throw new RuntimeException(&#39;Could not establish Memcached connection.&#39;);
    }

    return $memcached;
}

확장 코드를 캐시하려면 ServiceProvider를 생성하여 서비스 공급자를 등록해야 합니다. 서비스 제공자는 라라벨 애플리케이션 시작의 중심입니다. 자신의 애플리케이션과 라라벨의 모든 핵심 서비스는 서비스 제공자를 통해 시작됩니다.

그런데 '입문'이란 무엇을 의미하나요? 일반적으로 이는 서비스 컨테이너 바인딩, 이벤트 리스너, 미들웨어 및 경로 등록을 포함하여 항목을 등록하는 것을 의미합니다. 서비스 제공자는 애플리케이션 구성의 중심입니다.

Laravel과 함께 제공되는 config/app.php 파일을 열면 공급자 배열이 표시됩니다. 여기에는 애플리케이션에서 로드할 모든 서비스 공급자 클래스가 있습니다. 물론 이들 중 대부분은 게으른 클래스입니다. 즉, 요청될 때마다 로드되지 않고 실제로 사용될 때만 로드됩니다.

모든 서비스 제공자는 IlluminateSupportServiceProvider 클래스에서 상속됩니다. 대부분의 서비스 제공업체에는 등록 및 부팅이라는 두 가지 방법이 있습니다. 등록 메소드에서 해야 할 일은 서비스 컨테이너에 바인딩하는 것뿐입니다. 이벤트 리스너, 경로 또는 기타 기능을 등록하려고 시도하지 마십시오.

Artisan 명령 make:provider:

php artisan make:provider MemcachedExtendServiceProvider

모든 서비스 제공자는 등록을 통해 구성됩니다. config/app.php 파일. 이 파일에는 모든 서비스 공급자의 이름을 나열하는 공급자 배열이 포함되어 있습니다. 기본적으로 이러한 서비스 공급자는 메일, 대기열, 캐시 등과 같은 Laravel 핵심 구성 요소를 시작합니다.

자신의 서비스 제공업체를 등록하려면 다음 배열에 추가하세요.

&#39;providers&#39; => [
    SmartWiki\Providers\MemcachedExtendServiceProvider::class //
    在providers节点添加实现的provider
    ]

또한 config/cache.php에서 Memcached 구성을 구성하세요.

&#39;MemcachedExtend&#39; => [
    &#39;driver&#39; => &#39;MemcachedExtend&#39;,
    &#39;servers&#39; => [
        [
            &#39;host&#39; => env(&#39;MEMCACHED_EXTEND_HOST&#39;, &#39;127.0.0.1&#39;),
            &#39;port&#39; => env(&#39;MEMCACHED_EXTEND_PORT&#39;, 11211),
            &#39;weight&#39; => 100,
        ],
    ],
    &#39;options&#39; => [
        \Memcached::OPT_BINARY_PROTOCOL => true,
        \Memcached::OPT_COMPRESSION => false
    ]
]

확장 캐시에 세션을 저장해야 하는 경우 Session::extend를 호출하여 세션 저장소를 확장해야 합니다.

Session::extend(&#39;MemcachedExtend&#39;,function ($app){    
$memcached = $this->createMemcached($app);   
 return new MemcachedSessionHandler($memcached);
});

그런 다음 확장된 캐시에서 .env로 구성할 수 있습니다. 전체 코드는 다음과 같습니다.

<?php

namespace SmartWiki\Providers;

use Illuminate\Cache\Repository;
use Illuminate\Cache\MemcachedStore;
use Illuminate\Support\ServiceProvider;

use Cache;
use Session;
use Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcachedSessionHandler;
use RuntimeException;

class MemcachedExtendServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {

        Cache::extend(&#39;MemcachedExtend&#39;, function ($app) {

            $memcached = $this->createMemcached($app);

            // 从配置文件中读取缓存前缀
            $prefix = $app[&#39;config&#39;][&#39;cache.prefix&#39;];

            // 创建 MemcachedStore 对象
            $store = new MemcachedStore($memcached, $prefix);

            // 创建 Repository 对象,并返回
            return new Repository($store);
        });

        Session::extend(&#39;MemcachedExtend&#39;,function ($app){
            $memcached = $this->createMemcached($app);


            return new MemcachedSessionHandler($memcached);
        });
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * 创建Memcached对象
     * @param $app
     * @return mixed
     */
    protected function createMemcached($app)
    {
        // 从配置文件中读取 Memcached 服务器配置
        $servers = $app[&#39;config&#39;][&#39;cache.stores.MemcachedExtend.servers&#39;];


        // 利用 Illuminate\Cache\MemcachedConnector 类来创建新的 Memcached 对象
        $memcached = new \Memcached;

        foreach ($servers as $server) {
            $memcached->addServer(
                $server[&#39;host&#39;], $server[&#39;port&#39;], $server[&#39;weight&#39;]
            );
        }

        // 如果服务器上的 PHP Memcached 扩展支持 SASL 认证
        if (ini_get(&#39;memcached.use_sasl&#39;) && isset($app[&#39;config&#39;][&#39;cache.storess.MemcachedExtend.memcached_user&#39;]) && isset($app[&#39;config&#39;][&#39;cache.storess.MemcachedExtend.memcached_pass&#39;])) {

            // 从配置文件中读取 sasl 认证用户名
            $user = $app[&#39;config&#39;][&#39;cache.storess.MemcachedExtend.memcached_user&#39;];

            // 从配置文件中读取 sasl 认证密码
            $pass = $app[&#39;config&#39;][&#39;cache.storess.MemcachedExtend.memcached_pass&#39;];

            // 指定用于 sasl 认证的账号密码
            $memcached->setSaslAuthData($user, $pass);
        }

        //扩展
        if (isset($app[&#39;config&#39;][&#39;cache.stores.MemcachedExtend.options&#39;])) {
            foreach ($app[&#39;config&#39;][&#39;cache.stores.MemcachedExtend.options&#39;] as $key => $option) {
                $memcached->setOption($key, $option);
            }
        }
        $memcachedStatus = $memcached->getVersion();

        if (! is_array($memcachedStatus)) {
            throw new RuntimeException(&#39;No Memcached servers added.&#39;);
        }

        if (in_array(&#39;255.255.255&#39;, $memcachedStatus) && count(array_unique($memcachedStatus)) === 1) {
            throw new RuntimeException(&#39;Could not establish Memcached connection.&#39;);
        }

        return $memcached;
    }
}

SmartWikiCode


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.