Ejecutando php 8 con jit en Docker en 5 minutos

¡El invierno está llegando! Y junto con él, se acerca el lanzamiento de php 8. Si no puede esperar para probar su código en la versión beta de php 8, y al mismo tiempo se siente nervioso, por favor, debajo de cat.



TL: DR;



Todos los ejemplos se pueden descargar de github y ejecutar inmediatamente: github.com/xtrime-ru/php8-test



Formación



Primero debe instalar docker y docker-compose.



Ahora creemos un archivo opcache.ini que habilitará opcache y JIT en nuestro contenedor.

; 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




Ahora necesita crear un Dockerfile en su carpeta de trabajo.

La lista de paquetes y extensiones se proporciona como ejemplo. Puede eliminar estas líneas o especificar las extensiones que necesita. Además, algunas de las extensiones populares ya están incluidas en la imagen base. Por lo tanto, no es necesario incluir json, xml y muchos otros.



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




El último archivo permanece. Este es docker-compose.yml, que facilita la administración de contenedores durante el desarrollo.



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"




Ahora puede ejecutar la compilación y las pruebas del contenedor.



  1. Construye la imagen: docker-compose build
  2. Ejecute el contenedor en segundo plano: docker-compose up -d
  3. Conéctese al contenedor: docker exec -it php8-test / bin / bash
  4. La carpeta actual del contenedor se sincroniza con la carpeta del proyecto. Los archivos se pueden editar localmente.
  5. Descargue el archivo de referencia: github.com/php/php-src/blob/master/Zend/bench.php
  6. Ejecute el banco: php bench.php
  7. Puede deshabilitar jit u opcache dentro del contenedor aquí: /usr/local/etc/php/conf.d/opcache.ini para ver cómo cambia el rendimiento
  8. En docker-compose.yml, puede cambiar las directivas `volume` y` workdir` para vincular otros directorios al contenedor. También puede cambiar el punto de entrada para ejecutar otro comando al inicio del contenedor. Por ejemplo, `php artisan serve` para laravel.
  9. Todos los archivos también se pueden ver en el navegador en http://127.0.0.1:8000/

    Las directivas de puntos de entrada y puertos son responsables de esto.




Punto de referencia



Archivo de referencia del repositorio php oficial: 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, por supuesto, acelera enormemente las operaciones relacionadas con la CPU. Pero algo más me llamó la atención. Php por defecto es opcache.enable_cli = 0. Si habilita esta opción, puede obtener un doble aumento en el punto de referencia. Personalmente, no sabía que opcache puede acelerar tanto los comandos cli.



He probado varias veces en recipientes limpios, además de limpiar previamente el opcache. El resultado es siempre el mismo: opcache.enable_cli = 1 acelera el punto de referencia desde la primera ejecución.



La documentación de opcache.enable dice: "Si está deshabilitado, el código no se optimizará ni se almacenará en caché".



Desafortunadamente, en scripts cli reales, los resultados después de habilitar opcache.enable_cli y jit pueden ser muy diferentes. En un proyecto obtuve una ganancia del 5% (4.0 seg -> 3.8 seg), y en el otro proyecto, por el contrario, una desaceleración (0.088 seg -> 0.11 seg). Por lo tanto, definitivamente debe probar la configuración en sus propios proyectos.



All Articles