تشغيل php 8 مع jit في docker في 5 دقائق

الشتاء قادم! وإلى جانب ذلك ، اقترب إصدار php 8. إذا كنت لا تستطيع الانتظار لاختبار الكود الخاص بك في النسخة التجريبية من php 8 ، وفي نفس الوقت تشعر بالحيرة ، ثم من فضلك ، تحت cat.



TL: DR ؛



يمكن تنزيل جميع الأمثلة من جيثب وتشغيلها على الفور: github.com/xtrime-ru/php8-test



تدريب



تحتاج أولاً إلى تثبيت docker and 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 build
  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 ، يمكنك تغيير توجيهي "المجلدات" و "workdir" لربط المجلدات الأخرى بالحاوية. يمكنك أيضًا تغيير نقطة الإدخال لتشغيل أمر آخر عند بدء الحاوية. على سبيل المثال ، "php artisan serve" لـ laravel.
  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 بالطبع على تسريع العمليات المتعلقة بوحدة المعالجة المركزية بشكل كبير. لكن شيئاً آخر صدمني افتراضيات 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