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();
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; }
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); });
/** * 创建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; }
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 ]
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 ] ]
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); });
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