ホームページ php教程 PHP开发 SmartWiki が Laravel キャッシュ拡張機能を開発

SmartWiki が Laravel キャッシュ拡張機能を開発

Dec 02, 2016 pm 04:39 PM
laravel

SmartWiki デモ サイトは Alibaba Cloud 上にデプロイされているため、Alibaba Cloud には 128M の無料 Memcache サービスがあります。Memcached 設定方法に従って設定した後、Laravel がエラーを報告していることがわかりました。エラーの場所は addServer です。エラーが発生し、Alibaba Cloud に接続できません。

仕方ないので、Alibaba Cloudのインストールマニュアルに従ってスクリプトを書いてサーバーに置いた結果、接続して書き込むことができました。

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.php に Memcached オブジェクトを作成するコードは次のとおりです。

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 は setOption メソッドのオプションを設定せず、最も単純な接続の確立のみを実行し、その後 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 アプリケーションの起動の中心です。独自のアプリケーションとすべての Laravel のコアサービスは、サービスプロバイダーを通じて開始されます。

しかし、「スタートアップ」とは何を意味するのでしょうか?通常、これは、サービス コンテナー バインディング、イベント リスナー、ミドルウェア、さらにはルートの登録を含む、登録を意味します。サービス プロバイダーはアプリケーション構成の中心です。

Laravel に付属の config/app.php ファイルを開くと、プロバイダー配列が表示されます。もちろん、それらの多くは遅延ロードされます。毎回ロードされるわけではなく、リクエストごとにロードされ、実際に使用されるときにのみロードされます。

すべてのサービスプロバイダーは IlluminateSupportServiceProvider クラスを継承します。ほとんどのサービス プロバイダーには、 register と boot という 2 つのメソッドが含まれています。 register メソッドでは、イベント リスナー、ルート、またはその他の機能をサービス コンテナーにバインドすることだけを行う必要があります。

Artisan コマンド make:provider:

php 職人 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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP vs. Flutter: モバイル開発に最適な選択 PHP vs. Flutter: モバイル開発に最適な選択 May 06, 2024 pm 10:45 PM

PHP と Flutter は、モバイル開発でよく使われるテクノロジです。 Flutter は、クロスプラットフォーム機能、パフォーマンス、ユーザー インターフェイスに優れており、高パフォーマンス、クロスプラットフォーム、カスタマイズされた UI を必要とするアプリケーションに適しています。 PHP は、クロスプラットフォームではなく、パフォーマンスが低いサーバー側アプリケーションに適しています。

PHP でオブジェクト リレーショナル マッピング (ORM) を使用してデータベース操作を簡素化するにはどうすればよいですか? PHP でオブジェクト リレーショナル マッピング (ORM) を使用してデータベース操作を簡素化するにはどうすればよいですか? May 07, 2024 am 08:39 AM

PHP でのデータベース操作は、オブジェクトをリレーショナル データベースにマップする ORM を使用して簡素化されます。 Laravel の EloquentORM を使用すると、オブジェクト指向構文を使用してデータベースと対話できます。モデル クラスを定義したり、Eloquent メソッドを使用したり、実際にブログ システムを構築したりすることで ORM を使用できます。

Laravel - アーティザンコマンド Laravel - アーティザンコマンド Aug 27, 2024 am 10:51 AM

Laravel - アーティザン コマンド - Laravel 5.7 には、新しいコマンドを処理およびテストするための新しい方法が付属しています。これには職人コマンドをテストする新しい機能が含まれており、そのデモについては以下で説明します。

PHP単体テストツールの長所と短所の分析 PHP単体テストツールの長所と短所の分析 May 06, 2024 pm 10:51 PM

PHP 単体テスト ツール分析: PHPUnit: 大規模プロジェクトに適しており、包括的な機能を提供し、インストールが簡単ですが、冗長で遅い場合があります。 PHPUnitWrapper: 小規模プロジェクトに適しており、使いやすく、Lumen/Laravel に最適化されていますが、機能が限られており、コード カバレッジ分析は提供されず、コミュニティ サポートも限られています。

Laravel と CodeIgniter の最新バージョンの比較 Laravel と CodeIgniter の最新バージョンの比較 Jun 05, 2024 pm 05:29 PM

Laravel 9 と CodeIgniter 4 の最新バージョンでは、更新された機能と改善が提供されます。 Laravel9はMVCアーキテクチャを採用しており、データベース移行、認証、テンプレートエンジンなどの機能を提供します。 CodeIgniter4 は、HMVC アーキテクチャを使用してルーティング、ORM、およびキャッシュを提供します。パフォーマンスの面では、Laravel9 のサービスプロバイダーベースの設計パターンと CodeIgniter4 の軽量フレームワークにより、優れたパフォーマンスが得られます。実際のアプリケーションでは、Laravel9 は柔軟性と強力な機能を必要とする複雑なプロジェクトに適しており、CodeIgniter4 は迅速な開発や小規模なアプリケーションに適しています。

Laravel と CodeIgniter のデータ処理機能はどのように比較されますか? Laravel と CodeIgniter のデータ処理機能はどのように比較されますか? Jun 01, 2024 pm 01:34 PM

Laravel と CodeIgniter のデータ処理機能を比較します。 ORM: Laravel はクラスとオブジェクトのリレーショナル マッピングを提供する EloquentORM を使用しますが、CodeIgniter は ActiveRecord を使用してデータベース モデルを PHP クラスのサブクラスとして表します。クエリビルダー: Laravel には柔軟なチェーンクエリ API がありますが、CodeIgniter のクエリビルダーはよりシンプルで配列ベースです。データ検証: Laravel はカスタム検証ルールをサポートする Validator クラスを提供しますが、CodeIgniter には組み込みの検証関数が少なく、カスタム ルールの手動コーディングが必要です。実践例:ユーザー登録例はLarを示しています

PHPコードの単体テストと統合テスト PHPコードの単体テストと統合テスト May 07, 2024 am 08:00 AM

PHP 単体テストおよび統合テスト ガイド 単体テスト: コードまたは関数の単一単位に焦点を当て、PHPUnit を使用して検証用のテスト ケース クラスを作成します。統合テスト: 複数のコードユニットがどのように連携するかに注意し、PHPUnit の setUp() メソッドと TearDown() メソッドを使用してテスト環境をセットアップおよびクリーンアップします。実際のケース: PHPUnit を使用して、データベースの作成、サーバーの起動、テストコードの作成など、Laravel アプリケーションの単体テストと統合テストを実行します。

Laravel と CodeIgniter: 大規模プロジェクトにはどちらのフレームワークが適していますか? Laravel と CodeIgniter: 大規模プロジェクトにはどちらのフレームワークが適していますか? Jun 04, 2024 am 09:09 AM

大規模プロジェクト用のフレームワークを選択する場合、Laravel と CodeIgniter にはそれぞれ独自の利点があります。 Laravel はエンタープライズレベルのアプリケーション向けに設計されており、モジュール設計、依存関係の注入、強力な機能セットを提供します。 CodeIgniter は、速度と使いやすさを重視した、小規模から中規模のプロジェクトに適した軽量フレームワークです。複雑な要件と多数のユーザーを伴う大規模なプロジェクトには、Laravel のパワーとスケーラビリティがより適しています。単純なプロジェクトやリソースが限られている状況では、CodeIgniter の軽量で迅速な開発機能がより理想的です。

See all articles