Есть ли совместимый кэш памяти для PHP 7?

Я хотел бы использовать PHP 7. Однако, похоже, не существует опции для кэширования памяти с ключом.

APC прекращено.

XCache не будет доступен для PHP 7 в течение некоторого времени.

Есть ли альтернатива для PHP 7?

Или есть ли способ использовать PHP7 Opcache для реализации кэширования памяти с ключом?

Ответы

Ответ 1

Я бы предложил использовать Memcached, особенно если вас беспокоит производительность.

В то время как вы правы, что APC (u) намного быстрее, чем Memcache, вы не принимаете во внимание, что к тому времени, когда вы беспокоитесь об этих показателях, вы будете работать на нескольких серверах и APC (u) не могут быть разделены между узлами.

Вы можете использовать один экземпляр или кластер Memcache, чтобы обслуживать столько серверов приложений, сколько хотите. Масштабируемость вызывает большую озабоченность в современной разработке приложений, чем "сколько производительности я могу выжать из одного сервера?"

Сказав это, ваша альтернатива APCu, которая обладает всеми функциональными возможностями, которые вы использовали с APC. Он отмечен как стабильный с PHP7, но я бы не рекомендовал его из-за его единственного node характера и неспособности корректно работать с fastcgi.

Ответ 2

APCU - это буквально APC без кэширования кода (они взяли код APC, удалили кеш-байтовый код и выпустили его как APCU). Это замена. Именно в качестве пользовательского кэша APC он хранит данные в том же процессе, что и среда выполнения PHP, поэтому использование значения похоже на получение обычной переменной, следовательно, скорость.

Ответ 3

Другой подход (который я не пробовал, но звучит очень интересно) заключается в том, чтобы использовать opcache в качестве кеша ключевых значений. Это сообщение graphiq содержит более подробную информацию, но никакого реального кода, к сожалению (и обратите внимание на комментарии Керри Шваба).

Суть его в том, чтобы убедиться, что opcache включен и имеет достаточное количество памяти для данных, которые вам нужно кэшировать, а затем что-то в соответствии с строками следующего (снято с статьи, проверьте его полностью). Кэширование (кроме ручного удаления) также нужно будет обрабатывать, но его было бы сложно добавить (например, оберните свои данные в содержащий объект с истечением срока действия и проверьте его в cache_get, удалив и проигнорировав запись если он истек).

function cache_set($key, $val) {
   $val = var_export($val, true);
   // HHVM fails at __set_state, so just use object cast for now
   $val = str_replace('stdClass::__set_state', '(object)', $val);
   // Write to temp file first to ensure atomicity
   $tmp = "/tmp/$key." . uniqid('', true) . '.tmp';
   file_put_contents($tmp, '<?php $val = ' . $val . ';', LOCK_EX);
   rename($tmp, "/tmp/$key");
}

function cache_get($key) {
    @include "/tmp/$key";
    return isset($val) ? $val : false;
}

Из-за opcache это функционирует как кеш памяти, но это позволяет избежать накладных расходов на сериализацию и десериализацию. Я предполагаю, что cache_set также должен вызывать opcache_invalidate при записи (и в функции cache_delete, которая не существует в их примерах), но в остальном это кажется звуком для кеша, который не нужно обменивать между серверами.

Изменить: пример реализации с истечением кеша (только с точностью до секунды, может использовать microtime(true), если требуется более высокая точность) ниже. Минимальное тестирование действительно выполнено, и я отказался от конкретной замены HHVM, поэтому YMMV. Предложения по улучшению приветствуются.

class Cache {                                                                   
    private $root;                                                              
    private $compile;                                                           
    private $ttl;                                                               

    public function __construct($options = []) {                                
        $this->options = array_merge(                                           
            array(                                                              
                'root' => sys_get_temp_dir(),                                   
                'ttl'  => false,                                                
            ),                                                                  
            $options                                                            
        );                                                                      
        $this->root = $this->options['root'];                                   
        $this->ttl = $this->options['ttl'];                                     
    }                                                                           

    public function set($key, $val, $ttl = null) {                              
        $ttl = $ttl === null ? $this->ttl : $ttl;                               
        $file = md5($key);                                                      
        $val = var_export(array(                                                
            'expiry' => $ttl ? time() + $ttl : false,                           
            'data' => $val,                                                     
        ), true);                                                               

        // Write to temp file first to ensure atomicity                         
        $tmp = $this->root . '/' . $file . '.' . uniqid('', true) . '.tmp';     
        file_put_contents($tmp, '<?php $val = ' . $val . ';', LOCK_EX);         

        $dest = $this->root . '/' . $file;                                      
        rename($tmp, $dest);                                                    
        opcache_invalidate($dest);                                              
    }                                                                           

    public function get($key) {                                                 
        @include $this->root . '/' . md5($key);                                 

        // Not found                                                            
        if (!isset($val)) return null;                                          

        // Found and not expired                                                
        if (!$val['expiry'] || $val['expiry'] > time()) return $val['data'];    

        // Expired, clean up                                                    
        $this->remove($key);                                                    
    }                                                                           

    public function remove($key) {                                              
        $dest = $this->root . '/' . md5($key);                                  
        if (@unlink($dest)) {                                                   
            // Invalidate cache if successfully written                         
            opcache_invalidate($dest);                                          
        }                                                                       
    }                                                                           
}      

Ответ 4

PHP 7 кеш/список ускорителей

Listo of dead/outdated PHP accelerators: XCache, APC, memoize, ZendOpcache, chdb, hidef (they are not supporting PHP 7)

Мы можем найти список ускорителей PHP на веб-сайте PECL, но некоторые из них больше не поддерживаются или не обновляются.

В настоящее время разработаны (с поддержкой PHP 7.3):

Все инструкции по установке вы найдете в загруженном файле tgz/zip.

APCu WINDOWS USERS: Загрузите файлы DLL APCu и APCu_bc, которые соответствуют спецификации вашей системы x64 (64 бита) ИЛИ x86 (32-битные окна) выберите версию TS или UTS и, конечно, правильную версию PHP. Вставьте .DLL в свой каталог php/ext. Вы можете определить режим потока, просмотрев каталог php. Найти по имени файла DLL (например: php7ts.dll). Обратите внимание на TS или UTS в имени файла.

php -v покажет вам вашу текущую версию установки PHP CLI. Просто убедитесь, что ваша версия PHP совпадает с той, которую вы используете на своем сервере. Если нет, обновите путь среды Windows для PHP.

Если у вас возникли трудности, прочитайте это: Как установить apcu в Windows https://kapilpatel84.wordpress.com/2016/06/15/install-xdebug-apcu-on-windows-xampp-for-php7/

ДЛЯ XAMPP:

1) Загрузите совместимый APCu со следующей ссылкой http://pecl.php.net/package/apcu

2) APCu требуется совместное использование с APC, поэтому вам нужно скачать его по следующей ссылке. http://pecl.php.net/package/apcu_bc

3) Извлеките файл DDL и переместите файл DDL с именем: php_apc.dll и php_apcu.dll и скопируйте эти файлы в каталог PHP ext. т.е. C:\xampp\php\ext

4) Откройте файл php.ini и скопируйте следующий код внизу файла

[apcu]
extension="C:\xampp\php\ext\php_apcu.dll"
apc.enabled=1
apc.shm_size=32M
apc.ttl=7200
apc.enable_cli=1
apc.serializer=php
extension="C:\xampp\php\ext\php_apc.dll"

Когда вы распаковываете файл. Скопируйте файл DLL в папку расширений PHP np:.../php/ext. и настройте php.ini (инструкция conf включена в текстовый файл INSTALL).

Symfony 4

PS. Если случайно вы используете платформу Symfony, не забудьте включить APCu в config> packages> cache.yaml

framework:
    cache:
        app: cache.adapter.apcu

Используйте встроенный сервер с:

php bin/console server:run