Exécution de PHP 8 avec JIT dans Docker en 5 minutes

L'hiver arrive! Et avec lui, la sortie de php 8 approche. Si vous avez hâte de tester votre code en version bêta de php 8, et que vous vous sentez en même temps jit, alors s'il vous plaît, sous cat.



TL: DR;



Tous les exemples peuvent être téléchargés depuis github et exécutés immédiatement: github.com/xtrime-ru/php8-test



Entraînement



Vous devez d'abord installer docker et docker-compose.



Créons maintenant un fichier opcache.ini qui activera opcache et JIT dans notre conteneur.

; Extended PHP.ini file to enable JIT.
; ====================================
; Place this file under /usr/local/etc/php/conf.d/
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.jit_buffer_size=32M
opcache.jit=1235




Vous devez maintenant créer un Dockerfile dans votre dossier de travail.

La liste des packages et des extensions est fournie à titre d'exemple. Vous pouvez supprimer ces lignes ou spécifier les extensions dont vous avez besoin. En outre, certaines des extensions populaires sont déjà incluses dans l'image de base. Il n'est donc pas nécessaire d'inclure json, xml et bien d'autres.



FROM php:8.0-rc-cli

COPY opcache.ini /usr/local/etc/php/conf.d/

RUN apt-get update && apt-get upgrade -y \
    && apt-get install apt-utils -y \
#
#      
    && apt-get install git zip vim libzip-dev libgmp-dev libffi-dev libssl-dev -y \
#
#      
    && docker-php-ext-install -j$(nproc) sockets zip gmp pcntl bcmath ffi \
#
#      pecl  ,   php 8 pecl  ,    
#    && PHP_OPENSSL=yes pecl install ev \
#    && docker-php-ext-enable ev \
#
#      
    && docker-php-source delete \
    && apt-get autoremove --purge -y && apt-get autoclean -y && apt-get clean -y




Le dernier fichier reste. Il s'agit de docker-compose.yml, qui facilite la gestion des conteneurs pendant le développement.



version: '3.5'
services:
  php8-test:
    build: ./
    container_name: php8-test
    restart: unless-stopped
    volumes:
      - ./:/app
    working_dir: /app
    entrypoint: "php -S 0.0.0.0:8000"
    ports:
      - "127.0.0.1:8000:8000"
    logging:
      driver: "json-file"
      options:
        max-size: "1024k"
        max-file: "2"




Vous pouvez maintenant exécuter la compilation et les tests du conteneur.



  1. Construire l'image: build docker-compose
  2. Exécutez le conteneur en arrière-plan: docker-compose up -d
  3. Nous nous connectons au conteneur: docker exec -it php8-test / bin / bash
  4. Le dossier actuel sur le conteneur est synchronisé avec le dossier du projet. Les fichiers peuvent être modifiés sur la machine locale.
  5. Téléchargez le fichier de référence: github.com/php/php-src/blob/master/Zend/bench.php
  6. Exécutez le banc: php bench.php
  7. Vous pouvez désactiver jit ou opcache dans le conteneur ici: /usr/local/etc/php/conf.d/opcache.ini pour voir comment les performances changent
  8. Dans docker-compose.yml, vous pouvez modifier les directives `volumes` et` workdir` pour lier d'autres répertoires au conteneur. Vous pouvez également modifier le point d'entrée pour exécuter une autre commande au démarrage du conteneur. Par exemple, «php artisan serve» pour laravel.
  9. Tous les fichiers peuvent également être consultés dans le navigateur à l' adresse http://127.0.0.1:8000/

    Les directives de point d'entrée et de ports en sont responsables.




Référence



Fichier de référence du référentiel php officiel: github.com/php/php-src/blob/master/Zend/bench.php



#########################
# php 7.4.9
# opcache.enable=1
# opcache.enable_cli=0

simple             0.053
simplecall         0.007
simpleucall        0.019
simpleudcall       0.022
mandel             0.182
mandel2            0.220
ackermann(7)       0.038
ary(50000)         0.006
ary2(50000)        0.005
ary3(2000)         0.045
fibo(30)           0.069
hash1(50000)       0.014
hash2(500)         0.008
heapsort(20000)    0.036
matrix(20)         0.034
nestedloop(12)     0.089
sieve(30)          0.014
strcat(200000)     0.006
------------------------
Total              0.867

#########################
# php 7.4.9
# opcache.enable=1
# opcache.enable_cli=1

simple             0.007
simplecall         0.003
simpleucall        0.004
simpleudcall       0.003
mandel             0.088
mandel2            0.113
ackermann(7)       0.036
ary(50000)         0.006
ary2(50000)        0.007
ary3(2000)         0.039
fibo(30)           0.055
hash1(50000)       0.012
hash2(500)         0.008
heapsort(20000)    0.030
matrix(20)         0.029
nestedloop(12)     0.041
sieve(30)          0.011
strcat(200000)     0.007
------------------------
Total              0.499

#########################
# php 8.0-rc
# opcache.enable=1
# opcache.enable_cli=1
# opcache.jit_buffer_size=128M
# opcache.jit=1235

simple             0.002
simplecall         0.001
simpleucall        0.001
simpleudcall       0.001
mandel             0.008
mandel2            0.009
ackermann(7)       0.016
ary(50000)         0.006
ary2(50000)        0.007
ary3(2000)         0.015
fibo(30)           0.030
hash1(50000)       0.016
hash2(500)         0.011
heapsort(20000)    0.014
matrix(20)         0.012
nestedloop(12)     0.010
sieve(30)          0.004
strcat(200000)     0.006
------------------------
Total              0.168




JIT, bien sûr, accélère considérablement les opérations liées au processeur. Mais autre chose m'a frappé. Php est par défaut opcache.enable_cli = 0. Si vous activez cette option, vous pouvez obtenir une double augmentation de l'indice de référence. Personnellement, je ne savais pas qu'opcache pouvait tellement accélérer les commandes cli.



J'ai testé plusieurs fois sur des conteneurs propres, ainsi que sur le pré-nettoyage de l'opcache. Le résultat est toujours le même: opcache.enable_cli = 1 accélère le benchmark dès la première exécution.



La documentation opcache.enable dit: "Si désactivé, le code ne sera pas optimisé et mis en cache."



Malheureusement, dans les vrais scripts cli, les résultats après l'activation de opcache.enable_cli et jit peuvent être très différents. Sur un projet j'ai obtenu un gain de 5% (4,0 sec -> 3,8 sec), et sur l'autre projet, au contraire, un ralentissement (0,088 sec -> 0,11 sec). Par conséquent, vous devez absolument tester les paramètres sur vos propres projets.



All Articles