Невозможно получить кэшированную часть информации, которая была сохранена с приложением Laravel, но пытается получить доступ к приложению phalcon - PullRequest
1 голос
/ 04 июля 2019

Я пытаюсь сохранить строку с одним приложением в memcached. А затем после перенаправления http, пытаясь получить эту информацию из другого приложения на том же сервере. Я могу сохранить, но поиск информации не работает.

Я убедился, что оба приложения не применяют префикс к ключу кэша. Я запустил 'memcached-tool localhost: 11211 dump | less 'на сервере memcache, чтобы гарантировать, что данные существуют, что он и делает. Я могу получить доступ к данным из того же приложения, которое сохраняет данные. Поэтому, если я сохраню данные из приложения Laravel, я смогу извлечь их из приложения laravel и наоборот для приложения phalcon.

Используемые переменные среды одинаковы в обоих приложениях.

Настройка в Laravel (cache.php):

'memcached' => [
            'driver' => 'memcached',
            'servers' => [
                [
                    'host' => env('MEMCACHED_HOST', '127.0.0.1'),
                    'port' => env('MEMCACHED_PORT', 11211),
                    'weight' => 0,
                ],
            ],
        ],

Как я экономлю в Laravel:

Cache::put($sha, $viewData, 60);
return redirect("someUrl/{$sha}", 302);

Настройка в Phalcon:

$di->setShared('memcached', function(){
    // Cache data for one hour
    $frontCache = new \Phalcon\Cache\Frontend\Data(
        [
            'lifetime' => 60,
            'prefix' => ''
        ]
    );

// Create the component that will cache 'Data' to a 'Memcached' backend
// Memcached connection settings
    return new \Phalcon\Cache\Backend\Libmemcached(
        $frontCache,
        [
            'prefix' => '',
            'servers' => [
                [
                    'host'   => MEMCACHED_SERVER,
                    'port'   => MEMCACHED_PORT,
                    'weight' => 0,
                ]
            ]
        ]
    );
});

Как я пытаюсь получить информацию в Phalcon:

$cache = $this->di->getShared('memcached');
$info = $cache->get($cacheKey);

Вот вывод переменной $ cache из xdebug:

Phalcon\Cache\Backend\Libmemcached::__set_state(array(
   '_frontend' => 
  Phalcon\Cache\Frontend\Data::__set_state(array(
     '_frontendOptions' => 
    array (
      'lifetime' => 60,
      'prefix' => '',
    ),
  )),
   '_options' => 
  array (
    'prefix' => '',
    'servers' => 
    array (
      0 => 
      array (
        'host' => 'servername',
        'port' => port,
        'weight' => 0,
      ),
    ),
    'statsKey' => '',
  ),
   '_prefix' => '',
   '_lastKey' => '38404efbc4fb72ca9cd2963d1e811e95fe76960b',
   '_lastLifetime' => NULL,
   '_fresh' => false,
   '_started' => false,
   '_memcache' => 
  Memcached::__set_state(array(
  )),
))

А вот дамп из memcached-tool:

Dumping memcache contents
add 38404efbc4fb72ca9cd2963d1e811e95fe76960b 4 1562346522 144
a:5:{s:3:"zip";s:0:"";s:10:"first_name";s:5:"Clint";s:9:"last_name";s:9:"Broadhead";s:5:"phone";s:0:"";s:5:"email";s:20:"blah@blah.com";}

Я ожидал, что смогу сохранить в memcache из любого приложения, а затем извлечь этот кеш из любого другого места, имеющего доступ к тому же серверу. Но когда я пытаюсь получить в приложении phalcon, я получаю «ноль». Хотя я могу увидеть пару ключ / значение на сервере. Заранее благодарим за помощь.

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Я обошел использование встроенных внутренних классов и интерфейсов Phalcons и просто начал использовать PHP ext-memcached в приложении phalcon.

$di->setShared('memcached', function(){
if( !($this->_memcache instanceof \Memcached) ){
    if( !class_exists('Memcached') ){
        throw new CacheException('Unable to connect to cache');
    }
    $this->_memcache = new \Memcached();
    $this->_memcache->addServer(MEMCACHE_SERVER, MEMCACHE_PORT)
    return $this->_memcache;
}
});

Я начал идти по пути использования _PHCM фалконами, но как только вышеприведенное решение сработало, я отказался от этого исследования. Не самый лучший, но хорошо подходит для моей временной ситуации.

0 голосов
/ 04 июля 2019

Phalcon по умолчанию использует префиксы для всех ключей кэша.Для Libmemcached адаптера

Например, get для Libmemcached адаптера имеет:

let prefixedKey = this->_prefix . keyName;
let this->_lastKey = prefixedKey;
let cachedContent = memcache->get(prefixedKey);

https://github.com/phalcon/cphalcon/blob/3.4.x/phalcon/cache/backend/libmemcached.zep#L160

Просто убедитесь, что естьбез префиксов, задав опцию prefix в ваших опциях

$di->setShared('memcached', function(){
    // Cache data for one hour
    $frontCache = new \Phalcon\Cache\Frontend\Data(
        [
            'lifetime' => 60,
        ]
    );

    // Create the component that will cache 'Data' to a 'Memcached' backend
    // Memcached connection settings
    return new \Phalcon\Cache\Backend\Libmemcached(
        $frontCache,
        [
            'prefix'  => '',
            'servers' => [
                [
                    'host'   => MEMCACHED_SERVER,
                    'port'   => MEMCACHED_PORT,
                    'weight' => 0,
                ]
            ]
        ]
    );
});

https://github.com/phalcon/cphalcon/blob/3.4.x/phalcon/cache/backend.zep#L59

Наконец, если вышеприведенное не работает, установите утилиту, которая позволит вам запрашивать ваш экземпляр Memcachedи посмотрите, какие ключи там хранятся.Проверьте это перед сохранением данных в Laravel, а затем после.Таким образом, вы будете знать, проверяете ли вы правильную вещь или нет.

В качестве альтернативы вы можете использовать старый добрый telnet, если вам удобна командная строка для проверки ключей.

...