افزایش سرعت لاراول با کمک سول (swoole)

Swoole فریم‌ورک برنامه‌نویسی همگام در سطح تولید برای PHP است. یک اکستنشن PHP که به زبان C نوشته شده است و به توسعه دهندگان PHP کمک می‌کند تا بدون داشتن دانش زیاد از برنامه‌نویسی non-blocking I/O و هسته لینوکس، برنامه و سرویس‌های با عملکرد بالا T مقیاس پذیر، همزمان TCP و UDP و Unix socket و HTTP و سرویس‌های WebSocket را در PHP بنویسند.
اگر بخواهیم واضحتر توضیح بدهیم، می‌توانید Swoole را چیزی شبیه به NodeJS اما برای PHP و با عملکرد بالاتر در نظر بگیرید.

چرا لاراول را روی Swoole اجرا کنیم؟

تصویر زیر چرخه زندگی PHP را نشان می‌دهد. همانطور که می‌بینید، هنگامی که اسکریپت php را اجرا می‌کنید، PHP نیاز به راه‌اندازی اولیه ماژول‌ها و راه اندازی Zend Engine برای محیط در حال اجرا دارد. اسکریپت PHP برای اجرای Zend Engine باید در OpCodes کامپایل شود.

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

lifecycle in PHP

به عبارت دیگر، در چرخه عمر سنتیPHP، این کار باعث اتلاف وقت در ساخت و از بین بردن منابع برای اجرای اسکریپت شما می‌شود. تصور کنید که در فریم‌ورک‌هایی مثل لاراول، برای یک درخواست چند فایل باید لود شود؟ مسلما برای لود فایل‌ها، هم میزان مصرف ورودی و خروجی زیادی وجود دارد. اوضاع بدتر شد.!!!

اینجاست که Swoole وارد عمل می‌شود. چه اتفاقی می‌افتد اگر ما یک سرور داخلی در بالای Swoole داشته باشیم که بتوان همه اسکریپت‌ها را پس از لود در حافظه ذخیره کرد؟ به همین دلیل است که پیشنهاد می‌کنیم لاراول را روی Swoole اجرا کنید. Swoole عملکرد را تقویت می‌کند و لاراول ساختار ظریف و کاربردهای کد را فراهم می‌کند. این یک ترکیب عالی است!

نصب Swoole

ویژگی‌های اصلی swooletw / laravel-swoole را در این قسمت مشاهده می‌کنید:

اجرا شدن برنامه Laravel / Lumen بالای Swoole

افزایش عملکرد تا 30 برابر

حالت Sandbox برای جدا کردن container برنامه

پشتیبانی از سرور WebSocket در لاراول

پشتیبانی از پروتکل Socket.io

پشتیبانی از جدول Swoole برای به اشتراک‌گذاری دیتاهای cross-process

به این پکیج و کامپروسر نیاز داریم:

$ composer require swooletw/laravel-swoole

این پکیج به اکستنشن Swoole نیاز دارد. قبل از استفاده از این بسته، حتما Swoole را نصب کنید. برای نصب سریع از این دستور استفاده کنید.

pecl install swoole

LanguagePHP

بعد از نصب اکستنشن، باید php.ini را ویرایش کرده و یک خط extension=swoole.so اضافه کنید.

php -i | grep php.ini                      # check the php.ini file location
sudo echo "extension=swoole.so" >> php.ini  # add the extension=swoole.so to the end of php.ini
php -m | grep swoole                       # check if the swoole extension has been enabled

و service provider را اضافه کنید:

اگر از لاراول استفاده می‌کنید، service provider را به provider’s array در config/app.php اضافه کنید:

[
    'providers' => [
        SwooleTW\Http\LaravelServiceProvider::class,
    ],
]

اگر از Lumen استفاده می‌کنید، کد زیر را به bootstrap/app.php اضافه کنید:

$app->register(SwooleTW\Http\LumenServiceProvider::class);

توجه

اگر از لاراول 5.5 به بعد استفاده می‌کنید، می‌توانید از این مرحله صرف نظر کنید.

اجرا کردن Swoole

اکنون می‌توانید دستور زیر را برای راه اندازیSwoole HTTP server اجرا کنید.

$ php artisan swoole:http start
سپس پیام زیر را مشاهده می‌کنید:
Starting swoole http server...
Swoole http server started: <http://127.0.0.1:1215>

حالا می‌توانید در http://127.0.0.1:1215 به برنامه لاراول دسترسی پیدا کنید.

بنچمارک (Benchmark)

با استفاده از MacBook Air 13 ، 2015 با Lumen 5.5 تازه تست کنید.
ابزار بنچمارک گرفتن: wrk

wrk -t4 -c100 http://your.app

Nginx با FPM

Running 10s test @ http://lumen.app:9999
  4 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.14s   191.03ms   1.40s    90.31%
    Req/Sec    22.65     10.65    50.00     65.31%
  815 requests in 10.07s, 223.65KB read
Requests/sec:     80.93
Transfer/sec:     22.21KB

Swoole HTTP Server

Running 10s test @ http://127.0.0.1:1215
  4 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    11.58ms    4.74ms  68.73ms   81.63%
    Req/Sec     2.19k   357.43     2.90k    69.50%
  87879 requests in 10.08s, 15.67MB read
Requests/sec:   8717.00
Transfer/sec:      1.55MB
رقیه اباذری

رقیه اباذری

تو دانشگاه IT خوندم و اکثر منابع کتاب‌های ترجمه شده بودند و صدالبته مبهم :( مثلا element رو "عنصر" ترجمه می‌کردن و من همیشه می‌رفتم تو شیمی و جدول مندلیف. تو باورژن سعی کردم تا حد ممکن مطالب رو با زبان ساده و قابل درک بنویسم. باشد که کسانی که تازه پا به عرصه برنامه‌نویسی گذاشتن، راغب‌تر بشن و با نظرات و فیدبک‌های شما راه هموارتر بشه:)

دیدگاه‌ها


ثبت دیدگاه