web-dev-qa-db-fra.com

Existe-t-il un cache de mémoire compatible pour PHP 7?

Je voudrais utiliser PHP 7. Cependant, il ne semble pas y avoir d’option pour la mise en cache de la mémoire valeur-clé .

APC est interromp .

XCache ne sera pas disponible pour PHP 7 pendant un certain temps .

Existe-t-il une alternative disponible pour PHP 7?

Ou existe-t-il un moyen d'utiliser Opcache de PHP7 pour implémenter la mise en cache de la mémoire valeur-clé?

26
Frodik

Je suggérerais d'utiliser Memcached , en particulier si vous êtes préoccupé par les performances.

Bien que vous ayez raison de dire qu'APC (u) est beaucoup plus rapide que Memcache, vous ne tenez pas compte du fait que au moment où vous vous inquiétez pour ces métriques, vous rencontrerez plusieurs serveurs et APC (u) ne peuvent pas être partagés entre les nœuds.

Vous pouvez utiliser une seule instance ou un cluster Memcache pour desservir autant de serveurs d'applications que vous le souhaitez. L’évolutivité est une préoccupation plus grande dans le développement d’applications modernes que "quelle performance puis-je extraire d’un serveur?".

Cela dit, votre alternative est APC , qui dispose de toutes les fonctionnalités habituelles de APC. Il est marqué comme stable avec PHP7, mais je ne le recommanderais pas en raison de sa nature à nœud unique et de son incapacité à fonctionner correctement avec fastcgi.

29
Matt Prelude

APCU est littéralement APC sans la mise en cache du code (ils ont pris le code APC, a supprimé le cache de code d'octet et l'a publié en tant que APCU). C'est un remplacement immédiat. Exactement comme le cache utilisateur d'APC, il garde les données dans le même processus que l'exécution PHP), et l'utilisation de la valeur ressemble donc beaucoup à celle de l'extraction d'une variable ordinaire, d'où la rapidité.

13
Alister Bulman

Une autre approche (que je n'ai pas encore essayée, mais qui semble très intéressante) consiste à tirer parti de l'opcache en tant que cache de valeurs clés. Ce message graphiq contient plus de détails mais pas de code réel malheureusement (et notez les commentaires de Kerry Schwab).

L'essentiel est de s'assurer que l'opcache est activé et qu'il y a suffisamment de mémoire allouée pour les données que vous devez mettre en cache, puis que quelque chose ressemble à ce qui suit (extrait de l'article, extrayez-le intégralement). L’expiration de la mémoire cache (en dehors de la suppression manuelle) devrait également être traitée, mais elle ne serait pas difficile à ajouter (par exemple, envelopper vos données dans un objet contenant une date d’expiration et les vérifier dans votre cache_get, En supprimant ignorer l'enregistrement s'il est expiré).

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

En raison de l'opcache, cela fonctionne comme un cache en mémoire, mais cela évite la surcharge de la sérialisation et de la désérialisation. J'imagine que le cache_set devrait aussi appeler opcache_invalidate Lors de l'écriture (et dans la fonction cache_delete Qui n'existe pas dans leurs exemples), mais sinon, cela semble correct pour un cache qui n'a pas besoin de être partagé entre les serveurs.

Edit: un exemple de mise en œuvre avec expiration de la mémoire cache (précis à la seconde près, pourrait utiliser microtime(true) si davantage de précision est requise) ci-dessous Les tests minimaux réellement effectués et j'ai abandonné le remplacement spécifique à HHVM, donc YMMV. Suggestions d'améliorations bienvenues.

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

Liste de cache/accélérateur PHP 7

Liste des morts/obsolètes PHP accélérateurs: XCache, APC, memoize, ZendOpcache, chdb, hidef (ils ne sont pas supportant PHP 7)

Nous pouvons trouver une liste de PHP Accelerators sur site Web PECL , mais certains d'entre eux sont interrompus ou ne sont pas à jour.

Actuellement développés (avec le support de PHP 7.3)):

Vous trouverez toutes les instructions d'installation dans un fichier tgz/Zip téléchargé.

UTILISATEURS APCu WINDOWS: Télécharger APCu et APCu_bc DLL fichiers correspondant à la spécification de votre système x64 (64 bits) OR x86 (fenêtres 32 bits) sélectionnez la version TS ou UTS et bien sûr le droit PHP version. Collez .DLL dans votre répertoire php/ext . Vous pouvez déterminer le mode de thread à l'aide de en regardant votre répertoire php . Recherchez à DLL (par exemple: php7ts.dll). Notez le TS ou UTS dans le nom du fichier.

php -v vous montrera votre version PHP actuelle de la CLI. Assurez-vous simplement que votre version PHP est identique à celle que vous utilisez sur votre serveur. Sinon changez le chemin de l'environnement Windows pour PHP.

Si vous rencontrez des difficultés, lisez ceci: Comment installer apcu sous Windowshttps://kapilpatel84.wordpress.com/2016/06/15/install-xdebug-apcu-on-windows- xampp-for-php7 /

POUR XAMPP:

1) Télécharger des APCu compatibles avec le lien suivant http://pecl.php.net/package/apc

2) APCu a besoin de mots clés compatibles avec APC, vous devez donc le télécharger avec le lien suivant. http://pecl.php.net/package/apcu_bc

3) Extendez le fichier DDL et déplacez le fichier DDL nommé php_apc.dll et php_apcu.dll et copiez-le dans votre répertoire PHP ext. I.e C:\xampp\php\ext

4) Ouvrez le fichier php.ini et copiez le code suivant au bas du fichier

[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"

Lorsque vous décompressez le fichier. Copiez le fichier DLL dans votre PHP np: .../php/ext. Et configurez php.ini (l'instruction conf est incluse dans le texte INSTALL fichier).

Symfony 4

PS Si par hasard vous utilisez le framework Symfony, n'oubliez pas d'utiliser un APCu anable dans config> packages> cache.yaml

framework:
    cache:
        app: cache.adapter.apcu

Utiliser le serveur intégré avec:

php bin/console server:run
0
DevWL