Рубрики
Uncategorized

ThinkPHP 5.1 Изменение источника кэша

Автор оригинала: David Wong.

Представил

Недавно, изучая ThinkPHP 5.1, я увидел работу метода кэширования и был немного сбит с толку. Хотя многие методы инкапсулированы и используются удобно, расширенная работа Redis кажется не очень дружественной. В целях обучения исходный код был слегка изменен. Прежде всего, я заявляю о двух моментах: во-первых, эта поправка является только личной точкой зрения, не подходит для всех; во-вторых, эта поправка предназначена только для обучения, вы осторожны. Изменить исходный код

проблема

Практикуя Redis, вы обнаруживаете, что если вы хотите использовать расширенные методы, такие как hSethGet Wait, вам нужно вернуться к дескриптору, прежде чем вы сможете его выполнить. следующим образом

php

namespace app\index\controller;

use think\cache\driver\Redis;
use think\Controller;

class RedisTest extends Controller
{
    public function index()
    {
        $redis = new Redis();
        $redis = $redis->handler();

        dump($redis->hSet('h_name', '1', 'tom'));// int(1)
    }
}

Как видите, казнь прошла успешно. Вопрос в том, почему вы хотите сначала вернуть дескриптор, и вы можете использовать его __вызов Это волшебное решение.

Отслеживание исходного кода

Теперь, когда есть сомнения, нам нужно их разрешить. Отследите исходный код, см. thinkphp/library/think/cache/Driver.php Нет, я узнал. __вызов Просто обработчик Для возврата дескриптора для выполнения расширенного метода. Я не знаю, почему это не работает. __класс

Решите проблему

Решение состоит в том, чтобы thinkphp/library/think/cache/Driver.php Добавьте __вызов метода, чтобы не только Redis мог напрямую использовать расширенные методы, но и другие классы кэша, наследующие этот файл, могли использовать их напрямую. Код выглядит следующим образом

/**
     * Executing advanced methods
     * @param $method
     * @param $parameters
     * @return mixed
     */
    public function __call($method, $parameters)
    {
        return call_user_func_array(array($this->handler(), $method), $parameters);
    }

Посмотрите на тестовый код еще раз

handler();

        dump($redis->hSet('h_name', '2', 'jerry'));// int(1)
    }
}

Проблема была решена. Когда я закончил, мне показалось, что Ларавель работает. __звонок А потом я посмотрел на исходный код, и это правда. останься ravel/vendor/laravel/framework/src/Illuminate/Redis/RedisManager.php Существует следующий код

     /**
     * Pass methods onto the default Redis connection.
     *
     * @param  string  $method
     * @param  array  $parameters
     * @return mixed
     */
    public function __call($method, $parameters)
    {
        return $this->connection()->{$method}(...$parameters);
    }

эпилог

На самом деле символическое значение этой незначительной модификации больше, чем практическое значение. В конце концов, это не ошибка. обработчик Это также достижимо. Что для меня более важно, так это то, что я более склонен смотреть на исходный код, когда сталкиваюсь с некоторыми проблемами. Смотрите больше, естественные способности улучшатся.

Ссылки: Волшебный метод, кэш ThinkPHP, Laravel redis, call_user_func_array.