在5分钟内在docker中使用jit运行php 8

冬天快到了!随之而来的是php 8的发布,如果您迫不及待想在beta版本的php 8中测试您的代码,并且同时感到不安,请放心。



TL:DR;



所有示例都可以从github下载并立即运行:github.com/xtrime-ru/php8-test



训练



首先,您需要安装docker和docker-compose。



现在,让我们创建一个opcache.ini文件,该文件将在容器中启用opcache和JIT。

; 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




现在,您需要在工作文件夹中创建一个Dockerfile。

提供软件包和扩展名列表作为示例。您可以删除这些行或指定所需的扩展名。同样,一些流行的扩展已经包含在基本映像中。因此,无需包含json,xml和许多其他内容。



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




最后一个文件保留。这是docker-compose.yml,可以在开发过程中轻松管理容器。



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"




现在,您可以运行容器构建和测试。



  1. 构建映像:docker-compose构建
  2. 在后台运行容器:docker-compose up -d
  3. 连接到容器:docker exec -it php8-test / bin / bash
  4. 容器上的当前文件夹与项目文件夹同步。可以在本地计算机上编辑文件。
  5. 下载基准文件:github.com/php/php-src/blob/master/Zend/bench.php
  6. 运行工作台:php bench.php
  7. 您可以在以下容器中禁用jit或opcache:/usr/local/etc/php/conf.d/opcache.ini以查看性能如何变化
  8. 在docker-compose.yml中,您可以更改`volumes`和`workdir`指令以将其他目录链接到容器。您还可以更改入口点以在容器启动时运行另一个命令。例如,laravel的“ php artisan serve”。
  9. 还可以在浏览器中的http://127.0.0.1:8000/上查看所有文件

    。入口点和端口指令负责此操作。




基准测试



来自官方php存储库的基准文件: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大大加快了与CPU相关的操作。但是还有其他事打动了我。 PHP默认为opcache.enable_cli = 0。如果启用此选项,则基准可以双倍提高。就我个人而言,我不知道opcache可以大大加快cli命令的速度。



我已经在干净的容器上进行了多次测试,并预先清洁了opcache。结果始终是相同的:opcache.enable_cli = 1从第一次运行开始加速基准测试。



opcache.enable文件说:“如果禁用,代码不会被优化和缓存”。



不幸的是,在实际的cli脚本中,启用opcache.enable_cli和jit之后的结果可能会非常不同。在一个项目中,我获得了5%的收益(4.0秒-> 3.8秒),而在另一个项目中,我获得了减速(0.088秒-> 0.11秒)。因此,您必须绝对在自己的项目上测试设置。



All Articles