در قسمت دوم آموزش فعال کردن کامپایلر 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.
می توانید این دستور را نصب کنید تا گم شده نصب شود libxml2
sudo apt-get install libxml2-dev
پس از نصب وابستگی ها به کد منبع نیاز خواهیم داشت.
cd ~ 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.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 از فهرست منبع بررسی کنید.
منبع:
https://arkadiuszkondas.com/compiling-php-8-from-source-with-jit-support/