فعال کردن کامپایلر JIT در PHP 8 (آموزش دوم)

PHP 8در قسمت دوم آموزش فعال کردن کامپایلر JIT با شما هستیم. (قسمت اول آموزش)وابستگی هابرای تهیه PHP از منبع به چندین وابستگی نیاز خواهیم داشت.sudo apt-get update sudo apt-get install git build-essential libgccjit-6-dev libzip-dev autoconf re2c bison libxml2-dev -yممکن است معلوم شود که این کافی نیست. سپس یک قانون کلی وجود دارد: سعی کنید وابستگی گمشده را با پیشوند lib و / یا پسوند -dev نصب کنید. به عنوان مثال ، وقتی با خطایی مانند این روبرو شدید (در مرحله پیکربندی):configure: error: xml2-config not found. Please check your libxml2 installation.می توانید این دستور را نصب کنید تا گم شده نصب شود libxml2sudo apt-get install libxml2-devپس از نصب وابستگی ها به کد منبع نیاز خواهیم داشت.کلون سورس PHPcd ~ git clone https://github.com/php/php-src.git cd php-srcبه طور پیش فرض ، ما روی شاخه اصلی کار می کنیم ، بنابراین در حالت فعلی ، PHP 8.0.0-dev خواهد بود.پیکربندی کنیداز آنجا که پرونده ./configure وجود ندارد ، برای تولید یک مورد باید از ./buildconf استفاده کنیم:./buildconfبعد ، ما می خواهیم مجموعه خود را پیکربندی کنیم. برای تنظیم مسیر مقصد می توانید از پرچم --prefix استفاده کنید./configure --prefix=/opt/php/php8 --enable-opcache --with-zlib --enable-zip --enable-json --enable-sockets --without-pearبرای دیدن همه گزینه های موجود:./configure --helpوقتی همه چیز خوب پیش می رود باید ببینید:Generating files configure: creating ./config.status creating main/internal_functions.c creating main/internal_functions_cli.c +--------------------------------------------------------------------+ | License: | | This software is subject to the PHP License, available in this | | distribution in the file LICENSE. By continuing this installation | | process, you are bound by the terms of this license agreement. | | If you do not agree with the terms of this license, you must abort | | the installation process at this point. | +--------------------------------------------------------------------+ Thank you for using PHP. config.status: creating main/build-defs.h config.status: creating scripts/phpize config.status: creating scripts/man1/phpize.1 config.status: creating scripts/php-config config.status: creating scripts/man1/php-config.1 config.status: creating sapi/cli/php.1 config.status: creating sapi/phpdbg/phpdbg.1 config.status: creating sapi/cgi/php-cgi.1 config.status: creating ext/phar/phar.1 config.status: creating ext/phar/phar.phar.1 config.status: creating main/php_config.h config.status: executing default commandsاکنون ما آماده ساخت این پروژه هستیم.ساختنقبل از صدور دستور ساخت ، ارزش بررسی تعداد هسته شما در دستگاه شما:nprocاکنون می توانید با استفاده از این شماره برای ساخت سریعتر با پرچم -j استفاده کنید:make -j4با این کار از 4 هسته برای ساخت استفاده می شود. بعد از اتمام ساخت ، باید ببینید:Generating phar.php Generating phar.phar PEAR package PHP_Archive not installed: generated phar will require PHP's phar extension be enabled. directorytreeiterator.inc directorygraphiterator.inc pharcommand.inc clicommand.inc invertedregexiterator.inc phar.inc Build complete. Don't forget to run 'make test'.اگر زمان بیشتری دارید می توانید PHP کامپایل شده خود را تست کنید:make testدر مرحله بعد ، ما می خواهیم دودویی کامپایل شده را در یک مکان مستقل در دسترس قرار دهیم.نصبsudo make installاین دستور PHP را در قسمت --prefix (نصب شده در پیکربندی) نصب می کند. اکنون بررسی کنید که PHP کامپایل شده جدید کار می کند:/opt/php/php8/bin/php -v PHP 8.0.0-dev (cli) (built: Apr 5 2019 11:19:45) ( NTS ) Copyright (c) The PHP Group Zend Engine v4.0.0-dev, Copyright (c) Zend Technologiesشروع به جالب شدن می‌کند.فعال سازی افزونهو این نکته ای است که من کاملاً فراموش کردم. بدون آن ، هیچ پشتیبانی از JIT نخواهد داشت زیرا این یک بخش جدایی ناپذیر از Opcache است.در PHP JIT به عنوان بخشی تقریباً مستقل از OPcache پیاده سازی شده است. ممکن است در زمان کامپایل PHP و در زمان اجرا فعال / غیرفعال شود.ما می خواهیم افزونه opcache را فعال کنیم. از آنجا که هیچ پرونده پیکربندی وجود ندارد ، می توانید پرونده جدیدی ایجاد کنید. ابتدا اجازه می دهیم مسیر صحیح را بررسی کنیم:$ /opt/php/php8/bin/php --ini Configuration File (php.ini) Path: /opt/php/php8/lib Loaded Configuration File: (none)می توانید php.ini-Development یا php.ini-production را از فهرست منبع (و تغییر نام آن به php.ini) کپی کرده یا جدید ایجاد کنید.در این لحظه پرونده خالی جدید ایجاد کرده و پسوند بارگیری می شود.cd /opt/php/php8/lib sudo touch php.ini echo 'zend_extension=opcache.so' | sudo tee php.iniبا گزینه -v یا گزینه -m می توانید بررسی کنید که آیا همه چیز درست پیش می رود:/opt/php/php8/bin/php -v PHP 8.0.0-dev (cli) (built: Apr 5 2019 11:19:45) ( NTS ) Copyright (c) The PHP Group Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies with Zend OPcache v8.0.0-dev, Copyright (c), by Zend Technologiesظریفانه ، شما آخرین نسخه PHP را دارید. می توانیم بگوییم که شما دارای نسخه خونریزی لبه PHP هستید.چک کردن JITبرای بررسی اینکه JIT کار می کند یا می تواند کد شما را بهینه کند ، ایجاد اسکریپت ساده jit.php:for ($i=0; $i<100; $i++) { echo $i; }ابتدا آن را اجرا کنید و بررسی کنید که آیا این کار میکند:/opt/php/php8/bin/php jit.phpبرای فعال کردن JIT باید پرچم های اضافی را ارائه دهیم: opcache.enable_cli = 1 opcache.jit_buffer_size = 50000000 opcache.jit = 1235/opt/php/php8/bin/php -d opcache.enable_cli=1 -d opcache.jit_buffer_size=50000000 -d opcache.jit=1235 jit.phpجزئیات بیشتری درباره تنظیمات جدید در RFC خواهید یافتدر نگاه اول ، اگر می خواهید مطمئن باشید که IT کار می کند opcache.jit debug = 1:/opt/php/php8/bin/php -d opcache.enable_cli=1 -d opcache.jit_buffer_size=50000000 -d opcache.jit=1235 -d opcache.jit_debug=1 jit.phpشما باید کد مونتاژ تولید شده را ببینید:.L1: test $0x1, 0x9(%rdi) jnz .L8 .L2: mov $0x0, (%rdi) mov $0x4, 0x8(%rdi) .L3: mov $EG(exception), %rax cmp $0x0, (%rax) jnz JIT$$exception_handler jmp .L5 .L4: mov $0x7fd319514630, %r15 mov $0x5555cc61c100, %raxهمچنین می توانید عملکرد را با / بدون JIT با استفاده از فایل Zend / bench.php از فهرست منبع بررسی کنید.JITing مبارک ?منبع: https://arkadiuszkondas.com/compiling-php-8-from-source-with-jit-support/