Developers
Developers
خواندن ۵ دقیقه·۴ سال پیش

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

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.

می توانید این دستور را نصب کنید تا گم شده نصب شود libxml2

sudo apt-get install libxml2-dev

پس از نصب وابستگی ها به کد منبع نیاز خواهیم داشت.

کلون سورس PHP

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 کار می کند یا می تواند کد شما را بهینه کند ، ایجاد اسکریپت ساده 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/

برنامه نویسیطراحی وبطراحی سایتphpjit
دانشمندان چیزی را که قبلا وجود داشته کشف میکنند اما برنامه نویسان چیزی که قبلا وجود نداشته را خلق میکنند.
شاید از این پست‌ها خوشتان بیاید