• Час читання ~6 хв
  • 21.08.2023

Laravel Octane - Що, як і чому

Тейлор Отвелл вже показав погляд на останній пакет Laravel з відкритим вихідним кодом, Octane, під час своєї розмови Laracon Online - але сьогодні новий пакет доступний на GitHub для всіх для бета-тестування.

У цій публікації в блозі я збираюся дослідити Laravel Octane і розповісти вам, що це таке, як ви можете його встановити та використовувати, і чому він вам може знадобитися.

Застереження: Laravel Octane все ще є бета-програмним забезпеченням і його ще не слід використовувати у виробництві!

Що таке Laravel Octane?

Laravel Octane - це пакет з відкритим вихідним кодом, який підвищить продуктивність вашого додатка Laravel. Laravel Octane вимагає PHP 8, тому, якщо ви все ще використовуєте 7.x, вам потрібно оновити версію PHP. Під капотом Octane використовує Swoole Swoole і RoadRunner RoadRunner - два сервери додатків, які піклуються про обслуговування та завантаження вашого додатка Laravel. Чому це швидше, запитаєте ви. Дозвольте мені пояснити.

З традиційною програмою PHP, яка обслуговується через веб-сервер, такий як nginx, кожен вхідний запит буде породжувати працівника PHP-FPM. Це означає, що кожен запит запускає один окремий процес PHP, який буде виконувати всі необхідні завдання для обслуговування цього одного запиту.

У випадку Laravel це означає, що Framework потрібно завантажити, всі постачальники послуг реєструють свої послуги в контейнері, всі постачальники завантажуються самі, запит проходить через список класів проміжного програмного забезпечення, потрапляє на ваш контролер, перегляд відображається тощо, поки ми в кінцевому підсумку не отримаємо відповідь від нашого сервера.

З Swoole Swoole або RoadRunner RoadRunner у нас все ще є працівник для кожного вхідного HTTP-запиту, але всі вони мають однакову завантажену структуру. Це означає, що тільки перший вхідний запит буде завантажувати фреймворк (включаючи всіх постачальників послуг і т.д.), в той час як кожен другий запит може потім використовувати готовий фреймворк. І саме це робить Octane таким шалено швидким.

Початок роботи з Laravel Octane

Оскільки Laravel Octane - це пакет, вам потрібно встановити його як залежність від вашої конкретної програми. Ви можете зробити це за допомогою composer:

composer require laravel/octane\

Після того, як ви встановили Octane у своїй програмі, обов'язково запустіть php artisan octane:install. Це опублікує файл конфігурації Octane, а також додасть rr до файлу двійковий файл .gitignore RoadRunner RoadRunner.

Як я вже говорив, Octane збирається опублікувати свій файл конфігурації, який виглядає так:

return [
    /*
    |--------------------------------------------------------------------------
    | Octane Server
    |--------------------------------------------------------------------------
    |
    | This value determines the default "server" that will be used by Octane
    | when starting, restarting, or stopping your server via the CLI. You
    | are free to change this to the supported server of your choosing.
    |
    */
    'server' => env('OCTANE_SERVER', 'roadrunner'),
    /*
    |--------------------------------------------------------------------------
    | Force HTTPS
    |--------------------------------------------------------------------------
    |
    | When this configuration value is set to "true", Octane will inform the
    | framework that all absolute links must be generated using the HTTPS
    | protocol. Otherwise your links may be generated using plain HTTP.
    |
    */
    'https' => env('OCTANE_HTTPS', false),
    /*
    |--------------------------------------------------------------------------
    | Octane Слухачі Однією з особливостей Octane, яка ще не була задокументована, є можливість реєструвати користувацьких слухачів, коли щось відбувається на сервері
    |--------------------------------------------------------------------------
    |
    | All of the event listeners for Octane's events are defined below. These
    | listeners are responsible for resetting your application's state for
    | the next request. You may even add your own listeners to the list.
    |
    */
    'listeners' => [
        WorkerStarting::class => [
            EnsureUploadedFilesAreValid::class,
        ],
        RequestReceived::class => [
            ...Octane::prepareApplicationForNextOperation(),
            ...Octane::prepareApplicationForNextRequest(),
            //
        ],
        RequestHandled::class => [
            //
        ],
        RequestTerminated::class => [
            //
        ],
        TaskReceived::class => [
            ...Octane::prepareApplicationForNextOperation(),
            //
        ],
        TickReceived::class => [
            ...Octane::prepareApplicationForNextOperation(),
            //
        ],
        OperationTerminated::class => [
            FlushTemporaryContainerInstances::class,
            // DisconnectFromDatabases::class,
            // CollectGarbage::class,
        ],
        WorkerErrorOccurred::class => [
            ReportException::class,
            StopWorkerIfNecessary::class,
        ],
        WorkerStopping::class => [
            //
        ],
    ],
    /*
    |--------------------------------------------------------------------------
    | Warm / Flush Bindings
    |--------------------------------------------------------------------------
    |
    | The bindings listed below will either be pre-warmed when a worker boots
    | or they will be flushed before every new request. Flushing a binding
    | will force the container to resolve that binding again when asked.
    |
    */
    'warm' => [
        ...Octane::defaultServicesToWarm(),
    ],
    'flush' => [
        //
    ],
    /*
    |--------------------------------------------------------------------------
    | Garbage Collection Threshold
    |--------------------------------------------------------------------------
    |
    | When executing long-lived PHP scripts such as Octane, memory can build
    | up before being cleared by PHP. You can force Octane to run garbage
    | collection if your application consumes this amount of megabytes.
    |
    */
    'garbage' => 50,
    /*
    |--------------------------------------------------------------------------
    | Maximum Execution Time
    |--------------------------------------------------------------------------
    |
    | (info) 0 means no maximum limit
    |
    */
    'max_execution_time' => 30,
    /*
    |--------------------------------------------------------------------------
    | Octane Cache Table
    |--------------------------------------------------------------------------
    |
    | While using Swoole Swoole, you may leverage the Octane cache, which is powered
    | by a Swoole Swoole table. You may set the maximum number of rows as well as
    | the number of bytes per row using the configuration options below.
    |
    */
    'cache' => [
        'rows' => 1000,
        'bytes' => 10000,
    ],
    /*
    |--------------------------------------------------------------------------
    | Octane Swoole Swoole Tables
    |--------------------------------------------------------------------------
    |
    | While using Swoole Swoole, you may define additional tables as required by the
    | application. These tables can be used to store data that needs to be
    | quickly accessed by other workers on the particular Swoole Swoole server.
    |
    */
    'tables' => [
        'example:1000' => [
            'name' => 'string:1000',
            'votes' => 'int',
        ],
    ],
];

Далі вам потрібно вирішити для себе, чи хочете ви використовувати RoadRunner RoadRunner або Swoole Swoole. Потім можна настроїти сервер додатків, який потрібно використовувати, настроївши server ключ у файлі конфігурації. Це може бути swooleабо , або roadrunner.

RoadRunner RoadRunner

RoadRunner RoadRunner is an application server that is written in Go, that does not have any other dependencies within PHP itself. Choose RoadRunner RoadRunner, if you do not want to install additional PHP extensions. You can install RoadRunner RoadRunner through composer, like this:

composer require spiral/roadrunner

Swoole Swoole

Swoole Swoole comes with a couple of nice benefits, that RoadRunner RoadRunner can not provide. As Swoole Swoole is an extension on top of PHP, PHP itself gains some cool new features, such as "ticks" and "coroutines", which I'm going to cover in a bit. These features are not available with RoadRunner RoadRunner, so if you want to make use of them, you should go with Swoole Swoole.

You can install the Swoole Swoole extension using:

pecl install swoole

During the installation, you will be asked if you want to have support for HTTP2, curl, JSON, and open_ssl within Swoole Swoole. You can safely stick to the default values here (which are off) as those settings only affect things like coroutines. You will still be able to use curl, JSON, and everything else.

Запуск Octane Після того, як ви встановили RoadRunner або Swoole і визначили його у файлі octane.php конфігурації, ви можете запустити Octane

Once you have installed RoadRunner RoadRunner or Swoole Swoole, and defined it in your octane.php configuration file, you can start Octane and let it serve your Laravel application. The Octane server can be started with:

php artisan octane:start

За замовчуванням Octane запустить сервер на порту 8000, тому ви можете отримати доступ до своєї програми в браузері через http://localhost:8000.

Тож продовжуйте, відвідайте цей маршрут і спостерігайте, як літає ваш додаток Laravel! Якщо ви зробите кілька запитів до програми, то побачите, що перший працює трохи повільніше - саме там завантажується фреймворк, а інші помітно швидше, так як можуть використовувати завантажений фреймворк з пам'яті.

200 GET / .............. 14.23 ms
200 GET / ..............  1.93 ms
200 GET / ..............  2.06 ms

Внесення змін

до коду Якщо ви зараз підете і зміните код - наприклад, додасте новий /test маршрут - і спробуєте натиснути цю URL-адресу, ви отримаєте 404! І це тому, що запит все ще використовує фреймворк (і всі його маршрути / код), який був завантажений після запуску сервера Octane. Отже, щоб побачити зміну коду, вам потрібно перезапустити сервер Octane. Оскільки це дуже громіздко робити під час розробки, Octane поставляється з хорошим способом автоматично стежити за змінами кодової бази та автоматично перезапускати сервер Octane.

Для того, щоб це працювало, обов'язково встановіть Chokidar - бібліотеку перегляду файлів на основі NodeJS:

npm install --save-dev chokidar

Потім ви можете запустити сервер Octane у режимі "перегляду", наприклад:

php artisan octane:start --watch

Тепер, коли наступного разу, коли ви внесете зміни у свою кодову базу, це буде виявлено, і Octane перезапустить працівників для запитів, і ви зможете негайно побачити свої зміни.

Налаштування працівників Говорячи про працівників

- за замовчуванням Octane збирається запустити одного працівника для кожного ядра процесора, яке у вас є. Але ви також можете змінити це, передавши --workers опцію команді:

php artisan octane:start --workers=2

Swoole Swoole специфічні особливості

As I mentioned, Octane comes with a couple of Swoole Swoole специфічні особливості, so lets take a look at those, as I think they are very interesting.

Паралельні завдання

Octane дозволяє виконувати кілька завдань одночасно. Це означає, що вони будуть виконуватися одночасно і повернуться, як тільки всі завдання будуть закінчені.

Ось приклад, взятий з документації Octane на GitHub:

use App\User;
use App\Server;
use Laravel\Octane\Facades\Octane;
[$users, $servers] = Octane::concurrently([
    fn () => User::all(),
    fn () => Server::all(),
]);

Отже, у цьому прикладі ми отримуємо всіх користувачів і всі сервери одночасно. Щоб було зрозуміліше, ось ще один приклад: ми виконуємо два «завдання» одночасно,

Octane::concurrently([
	    function () {
		    	sleep(0.5);
		    	return 1;
	    },
	    function () {
		    	sleep(1);
		    	return 2;
	    },
	]);

і PHP продовжить оцінювати код, як тільки обидва завдання будуть завершені. Одне завдання чекає 0,5 секунди, інше - 1 секунду. Оскільки вони оцінюються одночасно, у двох окремих завданнях PHP зачекає рівно 1 секунду (а не 1,5), поки обидва результати не стануть доступними. Ця функція є чудовим способом виконувати кілька менших завдань одночасно.

Як і опція--workers, ви також можете налаштувати кількість--task-workers, яку октан повинен зробити доступною.

Ticks / Intervals

Octane in combination with Swoole Swoole, allows you to register ticks - which are operations that will automatically be executed at a given interval. Similar to the setInterval method in JavaScript. Unfortunately, there's no way to stop those ticks at the moment, but you can register them within your application like this:

Octane::tick('simple-ticker', fn () => ray('Ticking...'))
        ->seconds(10);

Кеш

Another new feature within Octane and Swoole Swoole is a new cache driver. This cache driver, according to the official documentation, provides read and write speeds of up to 2 million operations per second. Behind the scenes, Swoole Swoole is caching the data in a shared memory using Swoole Swoole Tables, which can be accessed across all workers. When the server restarts, the cached data will be flushed though, as the cache is only persisted in memory.

Щоб скористатися цим кешем, ви можете отримати доступ до нього через сховище кешу на фасаді кешу, наприклад

Cache::store('octane')->put('framework', 'Laravel', 30);

Another cool new addition, that is Swoole Swoole and Octane specific is the ability of a "cache interval". This allows you to store information in the Octane cache and refresh the data in a given interval:

use Illuminate\Support\Str;
Cache::store('octane')->interval('random', function () {
    return Str::random(10);
}, seconds: 5)

Octane Tables

Built upon the feature of Swoole Swoole Tables, you can create your own tables that you want to access within your Octane applications. These tables have the same performance benefit as a Cache would have, by allowing you to save data in a structured way. Keep in mind that all data that you store within such a table will be lost when the server restarts though.

Щоб налаштувати таблицю, ви можете створити запис у tables розділі вашого octane.php конфігураційного файлу

'tables' => [
    'example:1000' => [
        'name' => 'string:1000',
        'votes' => 'int',
    ],
],

:У цьому прикладі ми визначаємо таблицю з назвою example, яка може містити максимум 1.000 записів/рядків. Структура цієї таблиці являє собою name, який є рядком з максимальною довжиною 1000, і votes, який є цілим числом.

Для запису даних в цю таблицю можна скористатися методомOctane::table:

use Laravel\Octane\Facades\Octane;
Octane::table('example')->set('a-unique-identifier', [
    'name' => 'Marcel Pociot',
    'votes' => 1000,
]);

І щоб витягнути дані, ми можемо використовувати get метод на столі, наприклад

return Octane::table('example')->get('a-unique-identifier');

:Застереження з октаном

Є кілька речей, на які потрібно звернути увагу, коли ви хочете або підготувати існуючу програму до Octane, або почати створювати нову програму з нуля.

Оскільки Octane зберігає фреймворк у пам'яті всіх працівників, такі речі, як усі постачальники послуг додатків, будуть зареєстровані та завантажені лише один раз. Хоча Octane піклується про скидання стану власних пакетів (які включають Inertia), Octane не може скинути глобальний стан, який ви можете мати у власному коді програми.

Офіційна документація, яку в даний час можна знайти на GitHub , містить деякі з найпоширеніших сценаріїв, на які слід звернути увагу.

Слухачі Однією з особливостей Octane, яка ще не була задокументована, є можливість реєструвати користувацьких слухачів, коли щось відбувається на сервері

додатків в межах Octane. Ви можете підключитися до наступних подій:

  • WorkerStart
  • ЗапитОтримано
  • RequestHandled
  • ЗапитПрипинено
  • ЗавданняОтримано
  • ТікОтримано
  • ОпераціяПрипинено
  • WorkerErrorСталася
  • WorkerStopping

Щоб прикріпити слухачів до цих подій, ви можете додати їх до свого octane.php конфігураційного файлу.

Прогрівання та промивання

сервісу Коли завантажується новий працівник Octane, ви можете вказати список прив'язок/служб контейнерів, які ви хочете «розігріти» під час процесу завантаження. Це означає, що після завантаження працівника сервісний контейнер вже зробить зазначені служби доступними, щоб наступні запити могли негайно отримати до них

доступ.Octane вже має список внутрішніх служб, які він зберігає тепло під час кожного робочого процесу завантаження, але ви можете додати власні служби до розділу warm конфігураційного файлу octane.php .

Подібно до цього, ви також можете визначити список послуг, які ви хочете очистити, перш ніж надійде новий запит. Це може бути корисно для служб, якими маніпулюють під час запиту, який ви хочете скинути до початкового/розвантаженого стану, коли надходить новий запит.

Октанові маршрути

Якщо Octane ще не надає вам достатнього збільшення швидкості, ви навіть можете вичавити з нього трохи більше, скориставшись маршрутизацією, вбудованою прямо в Octane. Ви можете визначити власний октановий маршрут через октановий фасад так: Ці маршрути дуже швидкі, оскільки вони повністю пропускають систему маршрутизації Laravels (тому ці маршрути не забезпечують жодного проміжного програмного забезпечення) - що може бути корисним для кінцевих точок,

Octane::route('GET', '/fast', function() {
    
});

яким потрібно лише дуже швидко надавати дані.

Оскільки ядро HTTP в Laravel не використовується для цих запитів, вам потрібно самостійно повернути об'єкт Symfony Response, наприклад

use Symfony\Component\HttpFoundation\Response;
Octane::route('GET', '/faster', function() {
    return new Response('Hello from Octane.');
});

: Всі постачальники послуг, звичайно, завантажені та доступні, щоб ви все ще могли користуватися цими послугами, виконувати красномовні запити тощо.

Добре... так чому ж Октан?

Laravel Octane, безумовно, дасть вашому додатку Laravel великий приріст продуктивності - і ми всі любимо підвищення продуктивності, чи не так? Чи дійсно нам потрібне це підвищення продуктивності? Ну, може - думаю, це залежить від програми, яке ви запускаєте. Але що для мене важливіше, так це той факт, що Laravel (ще раз) просуває поточний стан PHP. Octane - це не тільки пакет, який вимагає принаймні PHP 8, але він також висуває захоплюючі нові функції у світі PHP, такі як спільні процедури, галочки та загалом мислення обслуговування власної програми за допомогою команди ремісника.

Я в захваті від майбутнього Octane!

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297