it-roy-ru.com

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

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

APC снят с производства .

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

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

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

26
Frodik

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

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

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

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

29
Matt Prelude

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

13
Alister Bulman

Другой подход (который я не пробовал, но звучит очень интересно) заключается в использовании 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
El Yobo

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

Список мертвых/устаревших PHP ускорители: XCache, APC, memoize, ZendOpcache, chdb, hidef (они не являются поддержка PHP 7)

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

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

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

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

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

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

ДЛЯ XAMPP:

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

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

3) Извлеките файл DDL и переместите файл DDL с именем: php_apc.dll и php_apcu.dll и скопируйте эти файлы в каталог PHP ext. I.e 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 Framework, не забудьте включить APCu в config> packages> cache.yaml

framework:
    cache:
        app: cache.adapter.apcu

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

php bin/console server:run
0
DevWL