Heim php教程 PHP开发 SmartWiki entwickelt Laravel-Caching-Erweiterung

SmartWiki entwickelt Laravel-Caching-Erweiterung

Dec 02, 2016 pm 04:39 PM
laravel

Da die SmartWiki-Demo-Site auf Alibaba Cloud bereitgestellt wird, verfügt Alibaba Cloud über einen 128 MB kostenlosen Memcache-Dienst. Nach der Konfiguration gemäß der Memcached-Konfigurationsmethode habe ich festgestellt, dass Laravel einen Fehler gemeldet hat addServer hat einen Fehler und kann nicht mit dem Memcache von Alibaba Cloud verbunden werden.

Ich war hilflos, also habe ich ein Skript im Alibaba Cloud-Installationshandbuch geschrieben und es auf den Server gestellt. Dadurch konnte ich eine Verbindung herstellen und schreiben.

Das von Alibaba Cloud bereitgestellte Skript lautet wie folgt:

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

Sehen Sie sich den Memcached-Treiber von Laravel an und erstellen Sie ein Memcached-Objekt in /vendor/laravel/framework/src/Illuminate/Cache/MemcachedConnector .php Der Code lautet wie folgt:

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

Sie können sehen, dass Memcached von Laravel die Option der setOption-Methode nicht festlegt. Es umfasst nur den einfachsten Verbindungsaufbau und ruft dann getVersion auf, um zu testen, ob dies der Fall ist verbunden. Der Democode von Alibaba Cloud legt die Optionen zum Deaktivieren der Komprimierung und zur Verwendung des binären Binärprotokolls fest.

Es bleibt nichts anderes übrig, als die Funktionen von Memcached selbst zu erweitern, um benutzerdefinierte Optionen zu implementieren. Der erweiterte Cache in Laravel kann mit Cache::extend erweitert werden. Der Erweiterungscode lautet wie folgt:

Cache::extend('MemcachedExtend', function ($app) {

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

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

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

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


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

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

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

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

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

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

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

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

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

    return $memcached;
}
Nach dem Login kopieren

Um den erweiterten Code zwischenzuspeichern, müssen Sie einen ServiceProvider erstellen, um den Dienstanbieter zu registrieren. Der Dienstanbieter ist das Zentrum für den Start der Laravel-Anwendung. Ihre eigene Anwendung und alle Kerndienste von Laravel werden über den Dienstanbieter gestartet.

Aber was meinen wir mit „Startup“? In der Regel bedeutet dies, Dinge zu registrieren, einschließlich der Registrierung von Service-Container-Bindungen, Ereignis-Listenern, Middleware und sogar Routen. Dienstanbieter sind das Zentrum der Anwendungskonfiguration.

Wenn Sie die mit Laravel gelieferte Datei config/app.php öffnen, sehen Sie ein Provider-Array. Hier sind alle von der Anwendung zu ladenden Dienstanbieterklassen Das heißt, sie werden nicht bei jeder Anforderung geladen, sondern nur, wenn sie tatsächlich verwendet werden.

Alle Dienstanbieter erben von der IlluminateSupportServiceProvider-Klasse. Die meisten Dienstanbieter bieten zwei Methoden: Registrieren und Booten. Bei der Register-Methode müssen Sie das Ding lediglich an den Service-Container binden. Versuchen Sie nicht, Ereignis-Listener, Routen oder andere Funktionen darin zu registrieren.

Sie können einfach einen neuen Anbieter über den Artisan-Befehl make:provider generieren:

php artisan make:provider MemcachedExtendServiceProvider

Alle Dienstanbieter werden über Registrieren in konfiguriert Die Datei config/app.php enthält ein Provider-Array, das die Namen aller Dienstanbieter auflistet. Diese Dienstanbieter starten Laravel-Kernkomponenten wie Mail, Warteschlangen, Caches usw.

Um Ihren eigenen Dienstanbieter zu registrieren, hängen Sie ihn einfach an dieses Array an:

'providers' => [
    SmartWiki\Providers\MemcachedExtendServiceProvider::class //
    在providers节点添加实现的provider
    ]
Nach dem Login kopieren

Konfigurieren Sie auch die Memcached-Konfiguration in config/cache.php:

'MemcachedExtend' => [
    'driver' => 'MemcachedExtend',
    'servers' => [
        [
            'host' => env('MEMCACHED_EXTEND_HOST', '127.0.0.1'),
            'port' => env('MEMCACHED_EXTEND_PORT', 11211),
            'weight' => 100,
        ],
    ],
    'options' => [
        \Memcached::OPT_BINARY_PROTOCOL => true,
        \Memcached::OPT_COMPRESSION => false
    ]
]
Nach dem Login kopieren

Wenn Sie die Sitzung in unserem erweiterten Cache speichern müssen, müssen Sie auch Session::extend aufrufen, um unseren Sitzungsspeicher zu erweitern:

Session::extend('MemcachedExtend',function ($app){    
$memcached = $this->createMemcached($app);   
 return new MemcachedSessionHandler($memcached);
});
Nach dem Login kopieren

Dann können Sie ihn in .env konfigurieren Unser erweiterter Cache. Der vollständige Code lautet wie folgt:

<?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('MemcachedExtend', function ($app) {

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

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

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

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

        Session::extend('MemcachedExtend',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['config']['cache.stores.MemcachedExtend.servers'];


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

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

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

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

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

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

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

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

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

        return $memcached;
    }
}

SmartWikiCode
Nach dem Login kopieren


Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP vs. Flutter: Die beste Wahl für die mobile Entwicklung PHP vs. Flutter: Die beste Wahl für die mobile Entwicklung May 06, 2024 pm 10:45 PM

PHP vs. Flutter: Die beste Wahl für die mobile Entwicklung

Laravel – Handwerkerbefehle Laravel – Handwerkerbefehle Aug 27, 2024 am 10:51 AM

Laravel – Handwerkerbefehle

Analyse der Vor- und Nachteile von PHP-Unit-Test-Tools Analyse der Vor- und Nachteile von PHP-Unit-Test-Tools May 06, 2024 pm 10:51 PM

Analyse der Vor- und Nachteile von PHP-Unit-Test-Tools

Wie verwende ich objektrelationales Mapping (ORM) in PHP, um Datenbankoperationen zu vereinfachen? Wie verwende ich objektrelationales Mapping (ORM) in PHP, um Datenbankoperationen zu vereinfachen? May 07, 2024 am 08:39 AM

Wie verwende ich objektrelationales Mapping (ORM) in PHP, um Datenbankoperationen zu vereinfachen?

Vergleich der neuesten Versionen von Laravel und CodeIgniter Vergleich der neuesten Versionen von Laravel und CodeIgniter Jun 05, 2024 pm 05:29 PM

Vergleich der neuesten Versionen von Laravel und CodeIgniter

Architektur und Praxis verteilter PHP-Systeme Architektur und Praxis verteilter PHP-Systeme May 04, 2024 am 10:33 AM

Architektur und Praxis verteilter PHP-Systeme

Wie vergleichen sich die Datenverarbeitungsfunktionen in Laravel und CodeIgniter? Wie vergleichen sich die Datenverarbeitungsfunktionen in Laravel und CodeIgniter? Jun 01, 2024 pm 01:34 PM

Wie vergleichen sich die Datenverarbeitungsfunktionen in Laravel und CodeIgniter?

PHP-Code-Unit-Tests und Integrationstests PHP-Code-Unit-Tests und Integrationstests May 07, 2024 am 08:00 AM

PHP-Code-Unit-Tests und Integrationstests

See all articles