Chia sẻ
//Tăng hiệu suất ứng dụng với Laravel Octane

Tăng hiệu suất ứng dụng với Laravel Octane

Như bạn đã biết, đối ứng dụng Laravel truyền thống thì PHP chỉ có thể xử lý một yêu cầu (request) tại một thời điểm nhưng với Laravel Octane bạn có thể xử lý nhiều request cùng lúc, giúp tăng tốc độ hoạt động của trang web lên.

1. Laravel Octane là gì?

Laravel Octane là một package mã nguồn mở được viết ra với mục đích giúp tăng tốc cho các ứng dụng Laravel. Nó sẽ khởi động ứng dụng của bạn một lần duy nhất, giữ nó trong bộ nhớ (RAM), sau đó mọi yêu cầu đến máy chủ thông qua ứng dụng sẽ được phân phát bằng cách sử dụng lại hoạt động đã được lưu trong RAM thay vì chạy ứng dụng lại từ đầu.

Vòng đời Request trong Laravel

Vòng đời Request trong Laravel Octane

Một tính năng khác của Laravel Octane là cho phép chúng ta sử dụng nhiều worker song song để xử lý request. Nhờ vậy, thay vì chạy từng request một như trước đây, bây giờ ta có thể cho tiến hành nhiều request cùng lúc.

Sơ đồ xử lý Request trong Laravel Octane

Sơ đồ xử lý Request trong Laravel Octane

Octane được phát triển trên nền tảng của FrankenPHP, Swoole và RoadRunner – 3 tiện ích xử lý bất đồng bộ dành cho PHP. Trong bài này ta chỉ tập trung vào nền tảng Swoole.

PHP Swoole được thiết kế dựa trên các nguyên tắc của Erlang, Node.js và Netty nhưng dành cho PHP. Tuy nhiên, do Swoole chỉ tương thích trên Linux Kernel nên hiện tại nó chỉ hoạt động được ở Linux, OS X, Cygwin hoặc WSL.

2. Sự khác nhau giữa PHP Swoole và PHP-FPM

Sau đây là bảng so sánh sự khác nhau giữa PHP Swoole và PHP-FPM.

PHP SwoolePHP-FPM
Hỗ trợ TCP, UDP, HTTP, HTTP2 và Unix SocketKhông. Phải dùng một số thư viện hỗ trợ
Sử dụng Non-blocking I/OKhông
Phân chia các worker process cho từng CPU – hỗ trợ xử lý đồng thờiKhông
Tải trước PHP file vào trong memoryKhông
Hỗ trợ kết nối long-live cho Websocket server hoặc TCP/UDP serverKhông

3. So sánh tốc độ của Laravel Octane với PHP-FPM

Để kiểm chứng sức mạnh thực sự của Laravel Octane, chúng ta sẽ có demo nho nhỏ và so sánh đánh giá (benchmark) thử xem kết quả ra sao giữa PHP Octane và PHP-FPM.

Chúng ta sẽ test tốc độ của Laravel Octane và PHP-FPM trong máy ảo VMware:

Test bench stats:

  • CPU: 2 cores (11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz)
  • RAM: 4GB
  • OS: Centos 7

Test applications:

  • Laravel 10.10
  • PHP 8.2

Web servers:

  • PHP-FPM
  • NGINX
  • Laravel Octane

Sử dụng công cụ wrk để test tốc độ.

(wrk là một công cụ kiểm tra khả năng chịu tải của website bằng cách giả lập nhiều kết nối đồng thời đến website của bạn.)

Với số luồng (threads) là 4, kết nối đồng thời (connections) là 100 và trang dùng để test chính là trang welcome mặc định có sẵn khi chúng ta cài đặt một trang web bằng Laravel.

Test tốc độ với lệnh wrk Laravel + Nginx + PHP-FPM

Laravel + Nginx + PHP-FPM

Test tốc độ với lệnh wrk Laravel Octane + Nginx

Laravel Octane + Nginx

Như các bạn thấy kết quả thì Laravel Octane nhanh gấp 5 lần so với PHP-FPM (Laravel Octane có thể xử lý ~42 requests/giây so với ~8 requests/giây của PHP-FPM)

Dưới đây là thời gian thực tế khi chúng ta test bằng trình duyệt (browser) sử dụng tiện ích (extensions) itsgoingd/clockwork

Test tốc độ trên browser Laravel + Nginx + PHP-FPM

Laravel + Nginx + PHP-FPM

Test tốc độ trên browser Laravel Octane + Nginx

Laravel Octane + Nginx

Chúng ta có thể thấy thời gian nhận phản hồi (response) từ request đầu tiên của Laravel Octane và PHP-FPM là gần bằng nhau. Nhưng từ những request sau browser sẽ tốn ít thời gian hơn rất nhiều để nhận response từ server.

4. Cài đặt và sử dụng

a. Cài đặt Octane

Octane có thể được cài đặt thông qua Composer:

composer require laravel/octane

Sau khi cài đặt Octane, bạn cần chạy lệnh Artisan octane:install để cài đặt các file config vào ứng dụng Laravel của bạn.

php artisan octane:install

b. Cài đặt Swoole

Vì trong bài này ta chỉ tập trung vào nền tảng Swoole nên mình chỉ hướng dẫn cài đặt Swoole.

Để xài Swoole trong Octane bạn cần phải cài đặt Swoole PHP extension. Điều này có thể thực hiện thông qua lệnh PECL:

pecl install swoole

c. Khởi động Octane

Bạn có thể khởi động Octane server bằng lệnh Artisan octane:start. Mặc định, lệnh này sẽ sử dụng file config config/octane.php để chạy.

Octane sẽ khởi động server ở port 8000, bạn có thể vào trang web với đường dẫn http://localhost:8000.

Để thay đổi port bạn chỉ cần thêm tùy chọn -–port 8888.

php artisan octane:start -–port 8888

d. Khởi động Octane với https

Khi ứng dụng chạy với Octane thì đường dẫn (link) sẽ được tạo ra với prefix là http://. Nếu bạn muốn sử dụng https:// thì chỉ cần thêm một biến OCTANE_HTTPS vào file .env và gán giá trị là true.

OCTANE_HTTPS=true

Hoặc thay đổi config/octane.php.

'https' => env('OCTANE_HTTPS', true),

e. Khởi động Octane với Nginx

Trên môi trường production, các ứng dụng nên được chạy thông qua các web servers như Nginx hoặc Apache. Nó sẽ giúp web server có thể truyền tải nội dung tĩnh như hình ảnh, css… Cũng như có thể quản lý chứng chỉ SSL của bạn.

Như ví dụ dưới đây, Nginx sẽ tải nội dung tĩnh của trang web tới máy chủ Octane đang chạy trên port 8000:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}
 
server {
    listen 80;
    listen [::]:80;
    server_name domain.com;
    server_tokens off;
    root /home/forge/domain.com/public;
 
    index index.php;
 
    charset utf-8;
 
    location /index.php {
        try_files /not_exists @octane;
    }
 
    location / {
        try_files $uri $uri/ @octane;
    }
 
    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
 
    access_log off;
    error_log  /var/log/nginx/domain.com-error.log error;
 
    error_page 404 /index.php;
 
    location @octane {
        set $suffix "";
 
        if ($uri = /index.php) {
            set $suffix ?$query_string;
        }
 
        proxy_http_version 1.1;
        proxy_set_header Host $http_host;
        proxy_set_header Scheme $scheme;
        proxy_set_header SERVER_PORT $server_port;
        proxy_set_header REMOTE_ADDR $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
 
        proxy_pass http://127.0.0.1:8000$suffix;
    }
}

5. Những điều cần lưu ý khi sử dụng Laravel Octane

a. Xử lý sự thay đổi file khi ứng dụng Octane đang hoạt động

Vì Octane sẽ khởi động ứng dụng của bạn một lần duy nhất, giữ nó trong bộ nhớ (RAM) nên mọi thay đổi đối với file trong ứng dụng sẽ không được phản ánh cho đến khi bạn tải lại trình duyệt của mình. Ví dụ, khi bạn thay đổi logic của function store trong CustomerController thì nó sẽ không được phản ánh cho tới khi server được khởi động lại. Để thuận tiện, bạn có thể sử dụng tùy chọn --watch để hướng dẫn Octane tự khởi động lại server khi có bất kỳ file nào được thay đổi trong ứng dụng của bạn:

php artisan octane:start --watch

Trước khi dùng tính năng này, phải đảm bảo rằng Node được cài đặt trong môi trường develop của bạn. Thêm vào đó, bạn nên cài đặt thêm thư viện chokidar (file-watching) vào ứng dụng:

npm install --save-dev chokidar

Bạn có thể cấu hình các folder và file cần được theo dõi bằng cách thay đổi config trong file config/octane.php:

Ví dụ, bạn đang sử dụng thư viện nwidart/laravel-modules và bạn muốn folder Modules sẽ được phản ánh khi có sự thay đổi ta sẽ làm như sau:

<?php
 
'watch' => [
    'app',
    'bootstrap',
    'config',
    'database',
    'public/**/*.php',
    'resources/**/*.php',
    'routes',
    'composer.lock',
    'Modules/**/*.php',  //folder laravel module
    'Modules/**/*.js',     //folder laravel module
    'Modules/**/*.css',  //folder laravel module
    '.env',
],

Lưu ý: Nếu như làm theo cách trên mà chức năng theo dõi file vẫn không hoạt động thì bạn cần chỉnh lại file vendor\laravel\octane\bin\file-watcher.cjs và đổi giá trị của usePolling thành true để mở chức năng theo dõi.

const watcher = chokidar.watch(paths, {
    ignoreInitial: true,
    usePolling: true,
});

Hoặc nếu sử dụng docker-compose.yml thì bạn có thể thêm environment CHOKIDAR_USEPOLLING với giá trị là true để bật chức năng này.

environment:
    CHOKIDAR_USEPOLLING: true

b. Chỉ định số lượng worker

Khi bạn khởi động ứng dụng Laravel Octane thì số lượng worker sẽ tương ứng với số lượng CPU core của server (Ví dụ server của bạn có 2 core thì mặc định sẽ có 2 worker). Những worker này sẽ được sử dụng để xử lý các HTTP request đến ứng dụng của bạn.

Kiểm tra tiến trình khi start Octane

Kiểm tra tiến trình khi start Octane

Bạn cũng có thể chỉ định thủ công số lượng worker bằng tùy chọn –-worker khi gọi lệnh octane:start.

php artisan octane:start --workers=4

Kiểm tra tiến trình khi start Octane với 6 worker

Kiểm tra tiến trình khi start Octane với 4 worker

Cần lưu ý: Nếu bạn sử dụng một số lượng worker nhiều hơn số CPU core trên server, có thể dẫn đến việc cạnh tranh tài nguyên và giảm hiệu suất. Vậy nên cần cân nhắc kĩ lưỡng khi điều chỉnh số lượng worker.

c. Rò rỉ bộ nhớ (Memory Leaks)

Octane giữ ứng dụng của bạn trong bộ nhớ (RAM) giữa các request. Do đó, việc thêm dữ liệu vào các đối tượng tĩnh (static object) sẽ dẫn đến memory leaks. Hãy xem ví dụ bên dưới:

Thêm route vào file routes/web.php.

<?php
 
use App\Http\Controllers\TestMemoryLeakerController;
use Illuminate\Support\Facades\Route;
 
Route::get('/test', [TestMemoryLeakerController::class, 'test']);

Tạo file App/Services/TestMemoryLeakerService.php.

<?php
 
namespace App\Services;
 
class TestMemoryLeakerService
{
    // Static array object
    public static array $staticArray = [];
 
    // Non-static array object
    public array $array = [];
}

Tạo file App/Http/Controllers/TestMemoryLeakerController.php.

<?php
 
namespace App\Http\Controllers;
 
use App\Services\TestMemoryLeakerService;
use Illuminate\Support\Str;
 
class TestMemoryLeakerController extends Controller
{
    public function test()
    {
        // Tạo string data với dung lượng 1MB
        TestMemoryLeakerService::$staticArray[] = Str::repeat('a', 1024 * 1024);
        $memoryUsage = memory_get_peak_usage(true) / 1024 / 1024;
 
        // dd ra kết quả và bạn sẽ thấy memory sẽ tăng liên tục mỗi khi bạn refresh trang
        dd($memoryUsage . "MB");
    }
}

Mục đích của đoạn code trên là đẩy 1 MB dữ liệu vào chuỗi (array). Vì đây là static object, nên khi user gửi request, dữ liệu sẽ được thêm vào array, làm tăng bộ nhớ sử dụng. Điều này xảy ra ở mọi nơi dữ liệu được thêm vào array đó, dẫn đến tình trạng tràn bộ nhớ và crash server.

Để giải quyết vấn đề này, bạn có thể sử dụng Dependency Injections, ví dụ đoạn code dưới đây:

<?php
 
namespace App\Http\Controllers;
 
use App\Services\TestMemoryLeakerService;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
 
class TestMemoryLeakerController extends Controller
    {
    public function test(TestMemoryLeakerService $testMemoryLeakerService)
    {
        // Tạo string data với dung lượng 1MB
        $testMemoryLeakerService->array[] = Str::repeat('a', 1024 * 1024);
        $memoryUsage = memory_get_peak_usage(true) / 1024 / 1024;
 
        // dd ra kết quả và F5 lại nhiều lần bạn sẽ thấy memory không thay đổi
        dd($memoryUsage . "MB");
    }
}

Ngoài ra, việc sử dụng công cụ barryvdh/laravel-debugbar trên Octane cũng sẽ xảy ra vấn đề tương tự về memory leaks, nhưng các nhà phát triển của barryvdh vẫn chưa vá được lỗi. Đây cũng là điểm bất tiện khi sử dụng công cụ này.

Khi gặp tình huống như vậy, đừng lo lắng, bạn có thể thay thế bằng itsgoingd/clockwork. Nó cũng hoạt động tốt như barryvdh/laravel-debugbar và cũng hỗ trợ Octane mà không xảy ra hiện tượng memory leaks.

Chỉ cần lên google và tìm kiếm từ khóa itsgoingd/clockwork sẽ có rất nhiều trang hướng dẫn bạn cài đặt từ a đến z.

d. Chỉ định Max Request Count

Để ngăn ngừa memory leaks, Octane sẽ khởi động lại những worker nào đã xử lý được 500 request (đây là giá trị mặc định khi xử lý của worker). Worker khi được khởi động lại, sẽ giải phóng toàn bộ memory mà nó đang chiếm. Con số mặc này có thể điều chỉnh bằng tùy chọn --max-requests:

php artisan octane:start --max-requests=250

e. Singleton

Khi áp dụng Octane cho ứng dụng Laravel, chúng ta cần đặc biệt chú ý vào việc quản lý những singleton object. Điều quan trọng là ứng dụng của chúng ta chỉ được khởi tạo một lần và với bất kỳ thay đổi nào cũng sẽ được giữ lại mãi mãi đến khi Octane server dừng hoạt động.

Truyền instance của ứng dụng đến các singleton

Không truyền instance của ứng dụng đến các singleton, thay vào đó hãy truyền một callback để trả về một instance.

<?php
 
use App\Service;
use Illuminate\Contracts\Foundation\Application;
 
// Không làm như này
$this->app->singleton(Service::class, function (Application $app) {
    return new Service($app);
});
<?php
 
use App\Service;
use Illuminate\Container\Container;
use Illuminate\Contracts\Foundation\Application;
 
// Hãy làm như này
$this->app->bind(Service::class, function (Application $app) {
    return new Service($app);
});
 
// Hoặc làm như này
$this->app->singleton(Service::class, function () {
    return new Service(fn () => Container::getInstance());
});

Các singleton sẽ tồn tại giữa các request, điều này nghĩa là instance của ứng dụng gốc được truyền vào khi singleton và được resolve lần đầu tiên sẽ được sử dụng khi service được gọi trong mỗi request ở những lần tiếp theo.

Truyền instance của request vào các singleton

Tương tự bên trên:

<?php
 
use App\Service;
use Illuminate\Contracts\Foundation\Application;
 
// Không làm như này
$this->app->singleton(Service::class, function (Application $app) {
    return new Service($app['request']);
});
<?php
 
use App\Service;
use Illuminate\Contracts\Foundation\Application;
 
// Hãy làm như này
$this->app->bind(Service::class, function (Application $app) {
    return new Service($app['request']);
});
 
// Hoặc làm như này
$this->app->singleton(Service::class, function (Application $app) {
    return new Service(fn () => $app['request']); // hoặc fn() => Container::getInstance()['request']
});

Truyền instance của config repository vào singleton

Tương tự bên trên:

<?php
 
use App\Service;
use Illuminate\Contracts\Foundation\Application;
 
// Không làm như này
$this->app->singleton(Service::class, function (Application $app) {
    return new Service($app->make('config'));
});
<?php
 
use App\Service;
use Illuminate\Container\Container;
use Illuminate\Contracts\Foundation\Application;
 
// Hãy làm như này
$this->app->bind(Service::class, function (Application $app) {
    return new Service($app->make('config'));
});
 
// Hoặc làm như này
$this->app->singleton(Service::class, function () {
    return new Service(fn () => Container::getInstance()->make('config'));
});

6. Những tính năng mới trong Laravel Octane

a. Concurrent Tasks

PHP theo mặc định là ngôn ngữ đồng bộ, đơn luồng sẽ chỉ cho phép xử lý một tác vụ tại một thời điểm. Nhưng khi bạn sử dụng Swoole, bạn có thể xử lý nhiều tác vụ đồng thời, điều này có thể được thực hiện với tính năng Concurrent.

Sơ đồ xử lý multiple task khi sử dụng tính năng Concurrent

Sơ đồ xử lý multiple task khi sử dụng tính năng Concurrent

Concurrent tasks sử dụng “task workers” để xử lý tác vụ. Số lượng task workers được chỉ định bằng tùy chọn --task-workers trong lệnh octane:start.

php artisan octane:start --workers=4 --task-workers=6

Xem ví dụ sau đây sẽ giúp bạn hiểu rõ hơn:

<?php
 
namespace App\Http\Controllers;
 
class TestConcurrentController extends Controller
{
    public function test()
    {
        $startTime = microtime(true);
 
        // Operation 1
        sleep(5);
        // Operation 2
        sleep(2);
        // Operation 3
        sleep(2);
 
        $endTime = microtime(true);
 
        $totalTime = $endTime - $startTime;
 
        dd($totalTime); // 9.**
    }
}

Output của biến $totalTime trong trường hợp này sẽ là gần 9 giây, tức là 5 + 2 + 2 là thời gian cần thiết để hoàn thành các thao tác này.

<?php
 
namespace App\Http\Controllers;
 
use Laravel\Octane\Facades\Octane;
 
class TestConcurrentController extends Controller
{
    public function test()
    {
        $startTime = microtime(true);
 
        Octane::concurrently([
            // Operation 1
            fn() => sleep(5),
            // Operation 2
            fn() => sleep(2),
            // Operation 3
            fn() => sleep(2),
        ]);
 
        $endTime = microtime(true);
 
        $totalTime = $endTime - $startTime;
 
        // --task-workers=2
        dd($totalTime); // 5.**
 
    }
}

Output của biến $totalTime trong trường hợp này sẽ là gần 5 giây, tức là thời gian cao nhất được thực hiện để xử lý bất kỳ thao tác nào trong phương thức concurrent của Octane. Tất cả các hoạt động được thực hiện như ví dụ trên có tên là Multiprocessing. Multiprocessing đơn giản là một kỹ thuật chạy các tác vụ khác nhau cùng một lúc. Hãy coi chúng như những luồng xử lý các quy trình, bạn đặt càng nhiều task workers thì càng có thể xử lý được nhiều tác vụ cùng lúc hơn.

<?php
 
namespace App\Http\Controllers;
 
use Laravel\Octane\Facades\Octane;
 
class TestConcurrentController extends Controller
{
    public function test()
    {
        $startTime = microtime(true);
 
        Octane::concurrently([
            fn() => sleep(2),
            fn() => sleep(2),
            fn() => sleep(2),
            fn() => sleep(2),
            fn() => sleep(2),
            fn() => sleep(2),
            fn() => sleep(2),
            fn() => sleep(2),
            fn() => sleep(2),
        ]);
 
        $endTime = microtime(true);
 
        $totalTime = $endTime - $startTime;
 
        // if --task-workers=6
        dd($totalTime); // 4.**
    }
}

Chúng ta có 9 tác vụ với 6 worker được chỉ định, mỗi worker này thực hiện 1 tác vụ nên chúng ta còn lại 3 tác vụ, thời gian thực hiện cho tác vụ này vẫn là khoảng 2 giây. Sau khi 6 tác vụ trước được hoàn thành, 3 tác vụ này sẽ được thực hiện tiếp tục. Tức là sẽ có worker chạy fn() => sleep(2) hai lần, điều này khiến thời gian xử lý mất nhiều nhất khoảng 4 giây.

Khi sử dụng concurrently method, bạn không nên cung cấp nhiều hơn 1024 tác vụ vì đây là giới hạn của Swoole.

b. Octane Cache

Khi sử dụng Swoole, bạn có thể sử dụng cache driver của Octane, cache driver này cung cấp tốc độ đọc và ghi lên tới 2 triệu thao tác mỗi giây. Do đó, cache driver của Octane là sự lựa chọn tuyệt vời cho các ứng dụng cần tốc độ đọc/ghi cực cao từ cache.

Tất cả dữ liệu được lưu trữ trong cache đều được chia sẻ cho tất cả workers trên máy chủ. Tuy nhiên, dữ liệu được lưu trong cache sẽ bị xóa khi server restart.

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
 
class TestCacheController extends Controller
{
    public function test()
    {
        Cache::store('octane')->put('a', Str::repeat('a', 10), 30);
        $a = Cache::store('octane')->get('a');
 
        dd($a);
    }
}

Chú ý: Bạn không thể dùng lệnh php artisan cache:clear để clear cache của Octane thay vào đó bạn cần restart lại server để clear cache.

c. Octane Table

Khi sử dụng Swoole, bạn có thể định nghĩa và tương tác với các table Swoole tùy ý của riêng mình. Các table Swoole cung cấp tốc độ truy xuất với hiệu suất cực cao và tất cả worker trên server có thể truy cập dữ liệu trong các table này.

Dữ liệu được lưu trữ ở đây theo hàng và cột giống như chúng ta làm trong bảng cơ sở dữ liệu. Để bắt đầu sử dụng tính năng, trước tiên phải thiết lập các table trong file config/octane.php như ví dụ bên dưới:

<?php
    'tables' => [
        'students:1000' => [
            'fullname' => 'string:1000',
            'class' => 'string:20',
            'created_at' => 'int',
        ],
        'classes:1000' => [
            'class_name' => 'string:1000',
            'class_code' => 'string:20',
            'created_at' => 'int',
        ],
    ],

Đối với table students:1000, 1000 biểu hiện số hàng tối đa mà table đó có thể chứa.

Đối với hàng string:n, 1000 và 20 biểu hiện kích thước cột tối đa (số byte) mà các hàng có thể chứa.

Nếu muốn tăng mức này lên thì bạn chỉ cần chỉnh sửa mảng cache trong file config/octane.php.

<?php
    'cache' => [
        'rows' => 1000,
        'bytes' => 10000,
    ],

Ví dụ:

<?php
 
namespace App\Http\Controllers;
 
use Carbon\Carbon;
use Laravel\Octane\Facades\Octane;
 
class TestTableController extends Controller
{
    public function test()
    {
        Octane::table('students')->set('class_monitor', [
            'fullname' => 'Joel Bradley',
            'class' => '12A7',
            'created_at' => Carbon::now()->timestamp,
        ]);
 
        Octane::table('students')->set('student', [
            'fullname' => 'Reece Bates',
            'class' => '12A7',
            'created_at' => Carbon::now()->timestamp,
        ]);
 
        $classMonitor = Octane::table('students')->get('class_monitor');
        $student = Octane::table('students')->get('student');
 
        dd([
            'class_monitor' => $classMonitor,
            'student' => $student,
        ]);
    }
}

Output:

array:2 [
  "class_monitor" => array:3 [
    "fullname" => "Joel Bradley"
    "class" => "12A7"
    "created_at" => 1706549430
  ]
  "student" => array:3 [
    "fullname" => "Reece Bates"
    "class" => "12A7"
    "created_at" => 1706549430
  ]
]

Có một số lưu ý cần cân nhắc khi sử dụng table Octane:

  • Dữ liệu được lưu trong table cache là dữ liệu tạm thời và sẽ mất khi server bị restart.
  • Những kiểu dữ liệu của cột được Swoole hỗ trợ chỉ có: string, int, float. Đây là cấu trúc dữ liệu tạm thời được lưu trong bộ nhớ. Nó không thể nào thay thế cho cơ sở dữ liệu.
  • Và nhắc lại một lần nữa, càng nhiều dữ liệu được lưu trữ trong table thì càng sử dụng nhiều dung lượng bộ nhớ (RAM).

d. Ticks & Intervals

Với việc sử dụng Swoole, bạn có thể sử dụng chức năng Ticks để thực hiện một thao tác lặp đi lặp lại sau một thời gian cụ thể. Chúng còn được gọi là internals giống như phương thức setInterval trong JavaScript.

<?php
 
namespace App\Providers;
 
use Illuminate\Support\ServiceProvider;
use Laravel\Octane\Facades\Octane;
 
class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        Octane::tick('simple-ticker', fn () =>
            var_dump('Ticking...'))->seconds(2);
    }
}

'simple-ticker' là tên của ticker fn () => var_dump('Ticking...') – đây là callable và sẽ được thực thi sau mỗi khoảng thời gian.
Lưu ý: Chúng ta không thể dừng lệnh ticks này khi server Octane đang hoạt động, Vì vậy, nên hãy cẩn thận khi sử dụng tính năng này.

Bạn cũng có thể sử dụng phương thức immediate để khi server Octane khởi động sẽ gọi ngay lệnh ticks và vẫn tiếp tục gọi lệnh ticks sau mỗi n giây sau đó:

<?php
 
namespace App\Providers;
 
use Illuminate\Support\ServiceProvider;
use Laravel\Octane\Facades\Octane;
 
class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        Octane::tick('simple-ticker', fn () =>
            var_dump('Ticking...'))->seconds(2)->immediate();
    }
}

7. Kết luận

Laravel Octane là giải pháp tối ưu hiệu suất ứng dụng, đặc biệt là trong xử lý nhiều công việc đồng thời. Tuy nhiên, cần chú ý đến sự tương thích và điều chỉnh cho phù hợp với các thư viện và chức năng của ứng dụng. Cùng với những tính năng mới, Laravel Octane hứa hẹn mang lại sự thuận tiện và mạnh mẽ trong phát triển ứng dụng Laravel, làm tăng đáng kể hiệu suất cho các dự án yêu cầu đặc tính này.


References

>>>>> Laravel Octane

>>>>> Free Performance + Extra features for Laravel using Octane and Swoole

>>>>> Laravel Octane: With Great Performance Comes Great Responsibility

Đọc thêm bài viết dưới để tăng hiệu suất trang web của bạn

>>>>> TỐI ƯU TỐC ĐỘ WEBSITE VỚI ASYNCHRONOUS VÀ DEFERRED JAVASCRIPT

 Ngụy Minh Tuấn
PHP Developer

ỨNG TUYỂN







    Chế độ phúc lợi

    CHÍNH SÁCH LƯƠNG & THƯỞNG

    Thấu hiểu tâm tư nguyện vọng của nhân viên, công ty Rivercrane Việt Nam đặc biệt thiết lập chế độ xét tăng lương định kỳ 2lần/năm. Xét đánh giá vào tháng 06 và tháng 12 hàng năm và thay đổi lương vào tháng 01 và tháng 07 hàng năm. Ngoài ra, nhân viên còn được thưởng thành tích định kỳ cho các cá nhân xuất sắc trong tháng, năm.

    CHẾ ĐỘ ĐÀO TẠO TẠI NHẬT

    Luôn luôn mong muốn các kỹ sư và nhân viên trong công ty có cái nhìn toàn diện về lập trình những mảng kỹ thuật trên thế giới, công ty Rivercrane Việt Nam quyết định chế độ 3 tháng 1 lần đưa nhân viên đi học tập tại Nhật. Các bạn kỹ sư hoàn toàn đều có thể quyết định khả năng phát triển bản thân theo hướng kỹ thuật hoặc theo hướng quản lý.

    CHẾ ĐỘ ĐI DU LỊCH HÀNG NĂM

    Không chỉ đưa đến cho nhân viên những công việc thử thách thể hiện bản thân, công ty Rivercrane Việt Nam muốn nhân viên luôn thích thú khi đến với những chuyến hành trình thú vị hàng năm. Những buổi tiệc Gala Dinner sôi động cùng với những trò chơi Team Building vui nhộn sẽ giúp cho đại gia đình Rivercrane thân thiết hơn.

    CHẾ ĐỘ EVENT CÔNG TY

    Những hoạt động Team building, Company Building, Family Building, Summer Holiday, Mid-Autumn Festival… sẽ là những khoảnh khắc gắn kết đáng nhớ của mỗi một nhân viên trong từng dự án, hoặc sẽ là những điều tự hào khi giới thiệu công ty mình với với gia đình thân thương, cùng nhau chia sẻ yêu thương với thông điệp “We are One”

    BẢO HIỂM

    Công ty Rivercrane Việt Nam đảm bảo tham gia đầy đủ chế độ Bảo hiểm xã hội, bảo hiểm y tế và bảo hiểm thất nghiệp. Cam kết chặt chẽ về mọi thủ tục phát sinh công ty đều hỗ trợ và tiến hành cho nhân viên từ đầu đến cuối. Những chế độ bảo hiểm khác công ty cũng đặc biệt quan tâm và từng bước tiến hành.

    CHẾ ĐỘ PHÚC LỢI KHÁC

    Hỗ trợ kinh phí cho các hoạt động văn hóa, văn nghệ, thể thao; Hỗ trợ kinh phí cho việc mua sách nghiên cứu kỹ thuật; Hỗ trợ kinh phí thi cử bằng cấp kỹ sư, bằng cấp dành cho ngôn ngữ. Hỗ trợ kinh phí tham gia các lớp học về quản lý kỹ thuật bên ngoài; Các hỗ trợ phúc lợi khác theo quy định công ty…

    © 2012 RiverCrane Vietnam. All rights reserved.

    Close