国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Home php教程 PHP開(kāi)發(fā) SmartWiki develops Laravel caching extension

SmartWiki develops Laravel caching extension

Dec 02, 2016 pm 04:39 PM
laravel

Because the SmartWiki demo site is deployed on Alibaba Cloud, Alibaba Cloud has a 128M free Memcache service. After configuring it according to the Memcached configuration method, I found that Laravel reported an error. Check the log and the error location is addServer error and cannot connect to Alibaba Cloud. Memcache.

I was helpless, so I wrote a script according to the Alibaba Cloud installation manual and put it on the server. As a result, I could connect and write.

The script provided by Alibaba Cloud is as follows:

<?php
$connect = new Memcached;  //聲明一個(gè)新的memcached鏈接
$connect->setOption(Memcached::OPT_COMPRESSION, false); //關(guān)閉壓縮功能
$connect->setOption(Memcached::OPT_BINARY_PROTOCOL, true); //使用binary二進(jìn)制協(xié)議
$connect->addServer(&#39;00000000.ocs.aliyuncs.com&#39;, 11211); //添加OCS實(shí)例地址及端口號(hào)
//$connect->setSaslAuthData(&#39;aaaaaaaaaa, &#39;password&#39;); //設(shè)置OCS帳號(hào)密碼進(jìn)行鑒權(quán),如已開(kāi)啟免密碼功能,則無(wú)需此步驟
$connect->set("hello", "world");
echo &#39;hello: &#39;,$connect->get("hello");
print_r( $connect->getVersion());
$connect->quit();

Look at laravel's Memcached driver. The code to create the Memcached object in /vendor/laravel/framework/src/Illuminate/Cache/MemcachedConnector.php is as follows:

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;
}

You can see Laravel's Memcached does not set the option of the setOption method. It only involves the simplest connection establishment, and then calls getVersion to test whether it is connected. Alibaba Cloud's demo code sets the options to turn off compression and use the binary binary protocol.

There is no choice but to extend the functions of Memcached yourself to implement custom options. The extended cache in laravel can be extended using Cache::extend. The extension code is as follows:

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

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

    // 從配置文件中讀取緩存前綴
    $prefix = $app[&#39;config&#39;][&#39;cache.prefix&#39;];

    // 創(chuàng)建 MemcachedStore 對(duì)象
    $store = new MemcachedStore($memcached, $prefix);

    // 創(chuàng)建 Repository 對(duì)象,并返回
    return new Repository($store);
});
/**
 * 創(chuàng)建Memcached對(duì)象
 * @param $app
 * @return mixed
 */
protected function createMemcached($app)
{
    // 從配置文件中讀取 Memcached 服務(wù)器配置
    $servers = $app[&#39;config&#39;][&#39;cache.stores.MemcachedExtend.servers&#39;];


    // 利用 Illuminate\Cache\MemcachedConnector 類(lèi)來(lái)創(chuàng)建新的 Memcached 對(duì)象
    $memcached = new \Memcached;

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

    // 如果服務(wù)器上的 PHP Memcached 擴(kuò)展支持 SASL 認(rèn)證
    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 認(rèn)證用戶(hù)名
        $user = $app[&#39;config&#39;][&#39;cache.storess.MemcachedExtend.memcached_user&#39;];

        // 從配置文件中讀取 sasl 認(rèn)證密碼
        $pass = $app[&#39;config&#39;][&#39;cache.storess.MemcachedExtend.memcached_pass&#39;];

        // 指定用于 sasl 認(rèn)證的賬號(hào)密碼
        $memcached->setSaslAuthData($user, $pass);
    }

    //擴(kuò)展
    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;
}

The cache extension code requires creating a ServiceProvider to register the service provider. The service provider is the center of Laravel application startup. Your own application and all Laravel's core services are started through the service provider.

But what do we mean by “startup”? Typically, this means registering things, including registering service container bindings, event listeners, middleware, and even routes. Service providers are the center of application configuration.

If you open the config/app.php file that comes with Laravel, you will see a providers array. Here are all the service provider classes to be loaded by the application. Of course, many of them are lazy loaded, which means that they are not loaded every time. They will be loaded every request, and will only be loaded when they are actually used.

All service providers inherit from the IlluminateSupportServiceProvider class. Most service providers contain two methods: register and boot . In the register method, the only thing you have to do is bind the thing to the service container. Do not try to register event listeners, routes or any other functionality in it.

You can simply generate a new provider through the Artisan command make:provider:

php artisan make:provider MemcachedExtendServiceProvider

All service providers are registered through the configuration file config/app.php, which contains A providers array listing the names of all service providers. By default, all core service providers are listed. These service providers enable core Laravel components such as mail, queues, caches, etc.

To register your own service provider, just append it to the array:

&#39;providers&#39; => [
    SmartWiki\Providers\MemcachedExtendServiceProvider::class //
    在providers節(jié)點(diǎn)添加實(shí)現(xiàn)的provider
    ]

Also configure the Memcached configuration in config/cache.php:

&#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
    ]
]

If you need to also store the Session in our extension We also need to call Session::extend in the cache to expand our Session storage:

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

Then we can configure our extended cache in .env. The complete code is as follows:

<?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;];

            // 創(chuàng)建 MemcachedStore 對(duì)象
            $store = new MemcachedStore($memcached, $prefix);

            // 創(chuàng)建 Repository 對(duì)象,并返回
            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()
    {
        //
    }

    /**
     * 創(chuàng)建Memcached對(duì)象
     * @param $app
     * @return mixed
     */
    protected function createMemcached($app)
    {
        // 從配置文件中讀取 Memcached 服務(wù)器配置
        $servers = $app[&#39;config&#39;][&#39;cache.stores.MemcachedExtend.servers&#39;];


        // 利用 Illuminate\Cache\MemcachedConnector 類(lèi)來(lái)創(chuàng)建新的 Memcached 對(duì)象
        $memcached = new \Memcached;

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

        // 如果服務(wù)器上的 PHP Memcached 擴(kuò)展支持 SASL 認(rèn)證
        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 認(rèn)證用戶(hù)名
            $user = $app[&#39;config&#39;][&#39;cache.storess.MemcachedExtend.memcached_user&#39;];

            // 從配置文件中讀取 sasl 認(rèn)證密碼
            $pass = $app[&#39;config&#39;][&#39;cache.storess.MemcachedExtend.memcached_pass&#39;];

            // 指定用于 sasl 認(rèn)證的賬號(hào)密碼
            $memcached->setSaslAuthData($user, $pass);
        }

        //擴(kuò)展
        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


Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How to create Laravel package (Package) development? How to create Laravel package (Package) development? May 29, 2025 pm 09:12 PM

The steps to create a package in Laravel include: 1) Understanding the advantages of packages, such as modularity and reuse; 2) following Laravel naming and structural specifications; 3) creating a service provider using artisan command; 4) publishing configuration files correctly; 5) managing version control and publishing to Packagist; 6) performing rigorous testing; 7) writing detailed documentation; 8) ensuring compatibility with different Laravel versions.

What is Middleware in Laravel? How to use it? What is Middleware in Laravel? How to use it? May 29, 2025 pm 09:27 PM

Middleware is a filtering mechanism in Laravel that is used to intercept and process HTTP requests. Use steps: 1. Create middleware: Use the command "phpartisanmake:middlewareCheckRole". 2. Define processing logic: Write specific logic in the generated file. 3. Register middleware: Add middleware in Kernel.php. 4. Use middleware: Apply middleware in routing definition.

Laravel Page Cache Policy Laravel Page Cache Policy May 29, 2025 pm 09:15 PM

Laravel's page caching strategy can significantly improve website performance. 1) Use cache helper functions to implement page caching, such as the Cache::remember method. 2) Select the appropriate cache backend, such as Redis. 3) Pay attention to data consistency issues, and you can use fine-grained caches or event listeners to clear the cache. 4) Further optimization is combined with routing cache, view cache and cache tags. By rationally applying these strategies, website performance can be effectively improved.

Laravel MVC Architecture: what can go wrong? Laravel MVC Architecture: what can go wrong? Jun 05, 2025 am 12:05 AM

Laravel'sMVCarchitecturecanfaceseveralissues:1)Fatcontrollerscanbeavoidedbydelegatinglogictoservices.2)Overloadedmodelsshouldfocusondataaccess.3)Viewsshouldremainsimple,avoidingPHPlogic.4)PerformanceissueslikeN 1queriescanbemitigatedwitheagerloading.

How to populate test data using Seeder in Laravel? How to populate test data using Seeder in Laravel? May 29, 2025 pm 09:21 PM

Using Seeder to fill test data in Laravel is a very practical trick in the development process. Below I will explain in detail how to achieve this, and share some problems and solutions I encountered in actual projects. In Laravel, Seeder is a tool used to populate databases. It can help us quickly generate test data, which facilitates development and testing. Using Seeder not only saves time, but also ensures data consistency, which is especially important for team collaboration and automated testing. I remember that in a project, we needed to generate a large amount of product and user data for an e-commerce platform, and Seeder came in handy at that time. Let's see how to use it. First, make sure your Lara is

What is Laravel Migrations? How to use it? What is Laravel Migrations? How to use it? May 29, 2025 pm 09:24 PM

Laravel's migration is a database version control tool that allows developers to programmatically define and manage database structure changes. 1. Create a migration file using the Artisan command. 2. The migration file contains up and down methods, which defines the creation/modification and rollback of database tables respectively. 3. Use the phpartisanmigrate command to execute the migration, and use phpartisanmigrate:rollback to rollback.

Laravel: Simple MVC project for beginners Laravel: Simple MVC project for beginners Jun 08, 2025 am 12:07 AM

Laravel is suitable for beginners to create MVC projects. 1) Install Laravel: Use composercreate-project--prefer-distlaravel/laravelyour-project-name command. 2) Create models, controllers and views: Define Post models, write PostController processing logic, create index and create views to display and add posts. 3) Set up routing: Configure/posts-related routes in routes/web.php. With these steps, you can build a simple blog application and master the basics of Laravel and MVC.

What are policies in Laravel, and how are they used? What are policies in Laravel, and how are they used? Jun 21, 2025 am 12:21 AM

InLaravel,policiesorganizeauthorizationlogicformodelactions.1.Policiesareclasseswithmethodslikeview,create,update,anddeletethatreturntrueorfalsebasedonuserpermissions.2.Toregisterapolicy,mapthemodeltoitspolicyinthe$policiesarrayofAuthServiceProvider.

See all articles