Forum PHP - 2014
 
            
         
            
        
 
            60 millions de visiteurs uniques par mois ...
 
            Qu'est qu'un cache d'opcode ?
Script PHP
<?php
$end = time() + 60 * 60 * 24 * 365;
echo strftime("Expire le %m/%d/%Y\n", $end);Noeuds
| 0 | T_OPEN_TAG | |
| 1 | T_VARIABLE | $end | 
| 2 | T_WHITESPACE | |
| 3 | = | |
| 4 | T_WHITESPACE | |
| 5 | T_STRING | time | 
| 6 | ( | |
| 7 | ) | |
| 8 | T_WHITESPACE | |
| 9 | + | |
| 10 | T_WHITESPACE | |
| 11 | ( | |
| 12 | T_LNUMBER | 60 | 
| 13 | T_WHITESPACE | |
| 14 | * | |
| 15 | T_WHITESPACE | |
| 16 | T_LNUMBER | 60 | 
| 17 | T_WHITESPACE | |
| 18 | * | |
| 19 | T_WHITESPACE | |
| 20 | T_LNUMBER | 24 | 
| 21 | T_WHITESPACE | |
| 22 | * | |
| 23 | T_WHITESPACE | |
| 24 | T_LNUMBER | 365 | 
| 25 | ) | |
| 26 | ; | |
| 27 | T_WHITESPACE | |
| 28 | T_ECHO | echo | 
| 29 | T_WHITESPACE | |
| 30 | T_STRING | strftime | 
| 31 | ( | |
| 32 | T_CONSTANT_ENCAPSED_STRING | "Expire le %m/%d/%Y\n" | 
| 33 | , | |
| 34 | T_WHITESPACE | |
| 35 | T_VARIABLE | $end | 
| 36 | ) | |
| 37 | ; | |
| 38 | T_WHITESPACE | 
Opcodes
0 EXT_STMT 1 ASSIGN !0, 1 2 EXT_STMT 3 BOOL_NOT ~1 !0 4 JMPZ ~1, ->7 5 EXIT 6 JMP ->7 7 RETURN 1
 
        Script PHP

Noeuds

Opcodes


Script PHP

Opcodes

Les caches d'opcode
 
        Avant 2007, règne de Turck MMCache et d'eAccelerator
Zend en observateur des premiers jours
 
        A partir de 2007 : APC monte sur le trône
 
        Début 2013, Zend libère Optimizer+
En mars 2013, RFC pour intégrer Optimizer+ dans PHP 5.5
Depuis, désaffection pour APC
Mais quid des autres solutions ?
NuSphere et ionCube ?
Bonne question !
 
        XCache fait de la résistance
 
        Raison du règne d'APC ?
apc_store()
Naissance d'APCu
Opcache est donc un simple cache d'opcodes ?
Script PHP

Noeuds

Opcodes

Opcodes


<?php
echo 60 * 60 * 24 * 365;
?>         line     # *  op         ext  return  operands
         ------------------------------------------------
            2     0  >   EXT_STMT
                  1      MUL             ~0      60, 60
                  2      MUL             ~1      ~0, 24
                  3      MUL             ~2      ~1, 365
                  4      ECHO                    ~2
            4     5    > RETURN                  1
         line     # *  op         ext  return  operands
         ------------------------------------------------
            2     0  >   EXT_STMT
                  1      ECHO                    31536000
            4     2    > RETURN                  1
        <?php
$x = 1;
if (!$x) exit;
?>line     # *  op         ext  return  operands
------------------------------------------------
   2     0  >   EXT_STMT
         1      ASSIGN                  !0, 1
   3     2      EXT_STMT
         3      BOOL_NOT        ~1      !0
         4    > JMPZ                    ~1, ->7
         5  > > EXIT
         6*     JMP                     ->7
         7  > > RETURN                  1
line     # *  op         ext  return  operands
------------------------------------------------
   2     0  >   EXT_STMT
         1      ASSIGN                  !0, 1
   3     2      EXT_STMT
         3    > JMPNZ                   !0, ->5
         4  > > EXIT
         5  > > RETURN                  1
        <?php
if (true) echo 'ok';
?>---- Pas optim ------ 0 EXT_STMT 1 JMPZ true, ->4 2 ECHO 'ok' 3 JMP ->4 4 RETURN 1 -- Optim bit 1 ------ 0 EXT_STMT 1 NOP 2 ECHO 'ok' 3 JMP ->4 4 RETURN 1 -- Optim bit 2 ------ 0 EXT_STMT 1 JMPZ true, ->4 2 ECHO 'ok' 3 NOP 4 RETURN 1 ----- Optim --------- 0 EXT_STMT 1 ECHO 'ok' 2 RETURN 1
Optimisation mémoire : interned strings
<?php
function test()
{
    return 'test';
}
$test = test();
echo $test;
?>
        Cinq chaînes
            
            Un seul emplacement mémoire
cache d'opcode + optimisation
=
gros gain de performance ?
Pas tout à fait !
cache : temps de réponse -50%
optimisation : temps de réponse -10%
OPCache : un outil magique ?
Pas tout à fait !
Un besoin de configuration important
                 
            
26 paramètres de configuration
Dont 15 impactant la performance ou la mise en cache
Les stratégies d'invalidation
revalidate_freq 2
validate_timestamps 1
revalidate_path 0
| Répertoire courant | Chemin d'inclusion | Fichier inclus | |
|---|---|---|---|
|  |  |   | monFichier.php | 
|  |  | ||
|  |  | ||
1 fichier en cache mais 3 clés pour y accéder.
Attention !
APC et OPCache ne se comportent pas de la même manière
Structure de répertoire avec capistrano :
 
                
        |-current -> releases / 1
        |
        |-releases
        |--1/
        |---index.php (inode: 80)
                    
            
        |-current -> releases / 2
        |
        |-releases
        |--1/
        |---index.php (inode: 80)
        |--2/
        |---index.php (inode: 250)
            max_wasted_percentage 5
Les stratégies de stockage
memory_consumption 64Mo
max_accelerated_files 2000
interned_strings_buffer 4Mo
save_comments 1
load_comments 1
Les filtres sur les fichiers
file_update_protection 2
max_file_size 0
blacklist_filename ""
Les stratégies d'optimisation
fast_shutdown 0
enable_file_override 0
optimization_level 0xffffffff
enable_cli 0
Quelle configuration pour quel environnement ?
Dév
Test
Prod
Activer :
Désactiver :
Flush obligatoire
Surveiller OPCache
 
        opcache_get_status();
 
             
             
             
        Suivre la consommation mémoire n'est pas suffisante !
Suivre les clefs de cache
Exemple, pour opcache.max_accelerated_files = 7 963
num_cached_scripts : 1 946 num_cached_keys : 7 963
opcache.log_verbosity_level = 4 (max)
 
            Fri Oct 10 15:07:44 2014 (14926): Debug No more entries in hash table!
 
        Suivre les interned strings
interned_strings_usage.free_memory : 0
 
        Et mes données utilisateurs ?
 
        Il n'y a pas qu'APC dans la vie !
 
        Pensez à shmop ou aux ramdisks !
Sinon, il y a toujours APCu ...
Pour stocker quoi d'ailleurs ?
 
        $content = '<?php return ' . var_export($configuration, true) . ';';
file_put_contents('/tmp/cache/configuration.php', $configuration);if (file_exists('/tmp/cache/config.php')) {
    $configuration = include('/tmp/cache/config.php');
} else {
    // ... génération
} 
        Attention à file_update_protection
... ce n'est pas une révolution
Attention à la configuration par défaut
                joind.in : https://joind.in/11960
                Slides : http://tech.ccmbg.com/forumphp-2014/
                
                @FredBouchery - @Beoneself
            
                Dév : dev/opcache.ini
                Test : test/opcache.ini
                Prod : prod/opcache.ini