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.soopcache.enable=1opcache.enable_cli=1opcache.jit_buffer_size=32Mopcache.jit=1235
Теперь в рабочей папке нужно создать Dockerfile.
Список пакетов и расширений приведен для примера. Можно удалить эти строки или указать нужные именно вам расширения. Так же часть популярных расширений уже включена в базовый образ. Так что подключать json, xml и многие другие не требуется.
FROM php:8.0-rc-cliCOPY 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"
Теперь можно запускать сборку контейнера и тесты.
- Собираем образ: docker-compose build
- Запускаем контейнер в фоне: docker-compose up -d
- Подключаемся к контейнеру: docker exec -it php8-test /bin/bash
- Текущая папка на контейнере синхронизирована с папкой проекта. Файлы можно редактировать на локальной машине.
- Скачиваем файл бенчмарка: github.com/php/php-src/blob/master/Zend/bench.php
- Запускаем бенч: php bench.php
- Можно отключить jit или opcache внутри контейнера тут: /usr/local/etc/php/conf.d/opcache.ini, что бы посмотреть, как изменится производительность
- В docker-compose.yml можно изменить директивы `volumes` и `workdir`, что бы залинковать другие директории в контейнер. Так же можно поменять entrypoint для запуска другой команды при старте контейнера. Например `php artisan serve` для laravel.
- Все файлы так же можно посмотреть в браузере по адресу http://127.0.0.1:8000/
За это отвечают директивы entrypoint и ports.
Бенчмарк
Файл бенчмарка из оффициального репозитория php: github.com/php/php-src/blob/master/Zend/bench.php
########################## php 7.4.9# opcache.enable=1# opcache.enable_cli=0simple 0.053simplecall 0.007simpleucall 0.019simpleudcall 0.022mandel 0.182mandel2 0.220ackermann(7) 0.038ary(50000) 0.006ary2(50000) 0.005ary3(2000) 0.045fibo(30) 0.069hash1(50000) 0.014hash2(500) 0.008heapsort(20000) 0.036matrix(20) 0.034nestedloop(12) 0.089sieve(30) 0.014strcat(200000) 0.006------------------------Total 0.867########################## php 7.4.9# opcache.enable=1# opcache.enable_cli=1simple 0.007simplecall 0.003simpleucall 0.004simpleudcall 0.003mandel 0.088mandel2 0.113ackermann(7) 0.036ary(50000) 0.006ary2(50000) 0.007ary3(2000) 0.039fibo(30) 0.055hash1(50000) 0.012hash2(500) 0.008heapsort(20000) 0.030matrix(20) 0.029nestedloop(12) 0.041sieve(30) 0.011strcat(200000) 0.007------------------------Total 0.499########################## php 8.0-rc# opcache.enable=1# opcache.enable_cli=1# opcache.jit_buffer_size=128M# opcache.jit=1235simple 0.002simplecall 0.001simpleucall 0.001simpleudcall 0.001mandel 0.008mandel2 0.009ackermann(7) 0.016ary(50000) 0.006ary2(50000) 0.007ary3(2000) 0.015fibo(30) 0.030hash1(50000) 0.016hash2(500) 0.011heapsort(20000) 0.014matrix(20) 0.012nestedloop(12) 0.010sieve(30) 0.004strcat(200000) 0.006------------------------Total 0.168
JIT, конечно, сильно ускоряет операции связанные с использованием CPU. Но меня поразило другое. В php по умолчанию используется opcache.enable_cli=0. Если включить эту опцию, то можно получить двухкратный рост в бенчмарке. Лично я не знал о том, что opcache может так ускорять cli команды.
Я проверял несколько раз на чистых контейнерах, а так же с предварительной очисткой opcache. Результат всегда один и тот же: opcache.enable_cli=1 ускоряет бенчмарк начиная с первого запуска.