همان طور که می دانیم، فریم ورک لاراول ویژگی های فراوانی در اختیار ما قرار داده است و پکیج های زیادی دارد که میتوانیم از آن ها برای ساخت برنامه های قدرتمند استفاده کنیم. اما، تا کنون این سوال را از خودتان پرسیده اید که چرخه ی حیات لاراول چگونه کار می کند؟ به نظرم دانستن این موضوع برای توسعه دهنده ها مهم است، زیرا اگر بدانیم که این چرخه چگونه کار میکند و با نقاط قوت و ضعف آن آشنا باشیم، میتوانیم آن را با توجه به نیازمان توسعه دهیم.
توضیح چرخه ی حیات لاراول در این مقاله نمی گنجد، اما به طور مختصر به آن می پردازم. هر درخواستی که به برنامه ی ما وارد می شود، به عنوان نقطه شروع، می خواهد فایل index.php در مسیر public را اجرا کند. از این فایل index، درخواست ابتدا به کرنل مربوط به HTTP، سپس به Service Provider ها، Route ها میرود و در نهایت پاسخی را برای کاربر ارسال میکند. می توانید چرخه ی حیات لاراول را به طور دقیق تر از مستندهای آن مطالعه کنید. در مراحل بالا، لاراول برخی از اسکریپت ها را اجرا، بارگذاری و کامپایل می کند (در اصل PHP تفسیر می شود، اما PHP به یک بایت کد میانی کامپایل می شود و سپس توسط موتور Zend زمان اجرا تفسیر می شود.). پس از آن، هنگامی که پاسخ ارسال می شود، همه ی شی های ایجاد شده از کلاس ها، از بین می روند.
PHP یک زبان تفسیری (interpreted) است. یعنی وقتی یک اسکریپت PHP اجرا می شود، مفسر در هر درخواست، کد را بارها و بارها parse، کامپایل و اجرا می کند. این کار ممکن است منجر به هدر رفتن منابع CPU و صرف زمان اضافی شود. برای مطالعه ی بیشتر می توانید به این مقاله مراجعه کنید.
خوشبختانه Swoole در این جا به کمک ما می آید. لاراول پکیج رسمی جدیدی به نام Laravel Octane منتشر کرده است که از Swoole به عنوان یک application server استفاده می کند. کاری که Swoole انجام می دهد این است که اسکریپت های کامپایل شده را در حافظه ذخیره می کند تا بعدا دوباره مورد استفاده قرار گیرند و آماده ی پذیرش درخواست های بعدی باشند. با این ویژگی، دیگر نیاز نیست با هر بار اجرای برنامه، کد ها تفسیر شوند.
Laravel Octane (لاراول اکتان)
Laravel Octane یک پکیج متن باز است که عملکرد برنامه ی لاراول را افزایش می دهد. Laravel Octane به PHP 8 نیاز دارد، بنابراین اگر هنوز از نسخه های 7 استفاده می کند، باید نسخه ی PHP خود را ارتقا دهید. Octane از Swoole و RoadRunner استفاده می کند. Swoole و RoadRunner دو application server هستند که از سرویس دهی و راه اندازی برنامه ی Laravel نگه داری می کنند.
چرا استفاده از Octane، سرعت برنامه را افزایش می دهد؟
با یک برنامه ی سنتی PHP که از طریق وب سروری مانند nginx ارائه می شود، در هر درخواستی که دریافت شود، یک Worker، PHP-FPM ایجاد می کند. یعنی هر درخواست، یک فرآیند PHP را راهاندازی میکند، که همه ی کارهای لازم برای پاسخگویی به آن درخواست را اجرا خواهد کرد.
در مورد لاراول، به این معنی است که Framework باید boot شود، همه ی وابستگی ها درservice container ثبت می شوند. درخواست HTTP از middleware ها عبور می کند، به کنترلر شما رفته، سپس یک view ارائه می شود تا در نهایت از سرور پاسخی ارسال شود.
با وجود Swoole یا RoadRunner، ما هنوز یک Worker برای هر درخواست HTTP دریافتی داریم، اما همه ی آن ها چارچوب بوت شده ی یکسانی دارند. یعنی تنها اولین درخواست ورودی Framework را بوت می کند (شامل همه ی Service Provider ها و غیره) در حالی که درخواست های دیگر می تواند از یک Framework آماده استفاده کند. و این همان چیزی است که Octane را بسیار سریع می کند.
شروع کار با لاراول اکتان
از آن جایی که Laravel Octane یک پکیج است، باید آن را به عنوان وابستگی برای برنامه ی خودتان نصب کنید. می توانید این کار را از طریق Composer انجام دهید:
composer require laravel/octane\
پس از نصب Octane، باید php artisan octane:install
را اجرا کنید. این فایل پیکربندی Octane را منتشر (publish) می کند، و همچنین rr- باینری RoadRunner را به فایل .gitignore اضافه می کند.
در مرحله ی بعد، باید از میان RoadRunner یا Swoole یکی را انتخاب کنید. سپس میتوانید سرور برنامه ای را که میخواهید با سفارشی کردن کلید سرور در فایل پیکربندی استفاده شود، تنظیم کنید که swoole یا roadrunner خواهد بود. در ادامه توضیح کوتاهی در مورد این دو سرور خواهیم داد.
RoadRunner
RoadRunner یک سرور برنامه است که در Go نوشته شده است و هیچ وابستگی دیگری در خود PHP ندارد. اگر نمی خواهید افزونه های اضافی PHP را نصب کنید RoadRunner را انتخاب کنید. شما می توانید RoadRunner را از طریق composer نصب کنید:
composer require spiral/roadrunner
Swoole
Swoole دارای چند مزیت خوب است که RoadRunner نمی تواند ارائه دهد. از آن جایی که Swoole یک افزونه در PHP است، خود PHP برخی از ویژگی های جالب جدید مانند "ticks" و "coroutines" را به دست می آورد که در ادامه به آن ها خواهم پرداخت. این ویژگی ها با RoadRunner در دسترس نیستند، بنابراین اگر میخواهید از آن ها استفاده کنید، باید با Swoole پیش بروید.
می توانید افزونه ی Swoole را با استفاده از دستور زیر نصب کنید:
pecl install swoole
در حین نصب، از شما پرسیده می شود که آیا می خواهید از HTTP2 ،curl ،JSON و open_ssl در Swoole پشتیبانی کنید یا خیر. میتوانید با خیال راحت به مقادیر پیش فرض در این جا (که غیرفعال هستند) پایبند باشید، زیرا این تنظیمات فقط روی مواردی مانند برنامه های مشترک تاثیر میگذارند. همچنان میتوانید از curl، JSON و هر چیز دیگری استفاده کنید.
استفاده از اکتان
هنگامی که RoadRunner یا Swoole را نصب کردید و آن را در فایل پیکربندی octane.php خود تعریف کردید، می توانید Octane را راه اندازی کنید و اجازه دهید برنامه ی لاراول شما را ارائه دهد. سرور Octane را می توان با دستور زیر شروع کرد:
php artisan octane:start
به طور پیش فرض، Octane سرور را روی پورت 8000 راه اندازی میکند، بنابراین میتوانید از طریق لینک زیر به برنامه خود در مرورگر دسترسی پیدا کنید.
http://localhost:8000
تمام، اکنون سرور شما در حال اجرا و آماده پذیرش درخواست ها است. به کارتان ادامه دهید و پرواز برنامه ی لاراول خود را تماشا کنید! اگر چند درخواست به برنامه ارسال کنید، می بینید که درخواست اول کمی کندتر است. این جاست که فریم ورک بوت میشود، در حالی که بقیه به طرز محسوسی سریع تر هستند، زیرا میتوانند از فریم ورک بوت شده در حافظه، استفاده کنند.
200 GET / .............. 14.23 ms
200 GET / .............. 1.93 ms
200 GET / .............. 2.06 ms
ایجاد تغییرات کد
حال اگر یک کد را تغییر دهید (برای مثال یک مسیر جدید اضافه کنید) و سعی کنید آن را در URL باز کنید، خطای 404 دریافت خواهید کرد! به این دلیل است که درخواست همچنان از همان چارچوب و مسیرهایی استفاده میکند که پس از راه اندازی سرور Octane بوت شد. بنابراین برای مشاهده ی تغییر کد، باید سرور Octane خود را دوباره راه اندازی کنید. از آن جایی که انجام این کار در حین توسعه بسیار دشوار است، Octane راه خوبی برای مشاهده ی خودکار کد شما برای تغییرات و راه اندازی مجدد سرور Octane، ارائه می کند.
برای انجام این کار، اول باید Chokidar که یک کتابخانه تماشای فایل مبتنی بر NodeJS را نصب کنید:
npm install --save-dev chokidar
سپس می توانید سرور Octane را در حالت watch راه اندازی کنید، به صورت زیر:
php artisan octane:start –watch
با این کار دفعه ی بعد که تغییری در کد خود ایجاد کنید، این مورد شناسایی می شود و Octane، worker ها را برای درخواست ها، دوباره راه اندازی می کند و می توانید خیلی سریع تغییرات خود را مشاهده کنید.
مقایسه عملکرد برنامه لاراول با و بدون Laravel Octane
در ادامه ی این مقاله قصد دارم کمی بیشتر وارد جزئیات شده و بنچمارک/مقایسه ای (benchmark/comparison) ساده بین اجرای برنامه های Laravel 8 با استفاده از Artisan serve و Swoole داشته باشیم. به همین منظور کمی بیشتر در مورد Swoole صحبت خواهیم کرد.
Swoole یک افزونه برای PHP است که با C نوشته شده است که در آن ویژگی های زیادی مانند Coroutine، وب سوکت ها و بسیاری دیگر را ارائه می دهد. با coroutine ها، میتوانیم PHP را به صورت ناهمزمان (asynchronously) build کنیم، بنابراین بسیار کارآمدتر از نسخه ی سنتی است. همچنین، برخی از ویژگی های دیگر مانند Swoole Table وجود دارد که می توانیم وب سوکت را در بالای آن build کنیم. برای دیدن ویژگی های دقیق Swoole به این لینک مراجعه کنید.
مقایسه ی اول: درخواست های وب
اولین مقایسه ای که می خواهم انجام دهم یک مقایسه ساده است. لاراول را با استفاده از Artisan Serve اجرا می کنم و آن را با استفاده از سرور Swoole مقایسه می کنم. هیچ چیزی را در مسیرهای وب تغییر نمیدهم، یعنی صفحه خوش آمدگویی پیش فرض لاراول را خواهیم داشت.
برای مقایسه، از ApacheBench در ترمینال با این دستور استفاده می کنم:
ab -n 1000 -c 100 http://localhost:8000/
دستور بالا به این معنی است که 1000 درخواست وجود خواهد داشت که 100 تای آن ها همزمان خواهند بود. نتیجه ی سرور Swoole به صورت زیر خواهد بود:
نتیجه سرویس Artisan:
از مقایسه ی ساده ی بالا می توانیم ببینیم که برای 1000 درخواست با 100 همزمانی، 0.452 ثانیه برای Swoole و 4.531 ثانیه طول می کشد تا Artisan Serve به پایان برسد. سپس، برای کل درخواست های قابل رسیدگی در هر ثانیه: Swoole می تواند 2214 درخواست در ثانیه را رسیدگی کند، که در آن Artisan Serve فقط می تواند 220 درخواست در ثانیه را رسیدگی کند. این اعداد ثابت می کنند که شکاف های زیادی در عملکرد دارند، یعنی با استفاده از Swoole تا 10 برابر سریع تر.
مقایسه ی دوم: درخواست های API
برای API، یک endpoint ساده به نام /test داریم که یک رشته ی “Hello World” را بر می گرداند. در این مقایسه، از Lumen نیز استفاده می کنم زیرا Lumen ادعا می کند که عملکرد بهتری در مقایسه با Laravel دارد. بیایید نتایج را ببینیم:
سرور Laravel Swoole:
سرویس Laravel Artisan:
سرویس Lumen Artisan:
بر اساس مقایسه ی بالا، می توان دید که عملکرد Lumen مشابه Swoole است. Lumen میتواند 1168 درخواست در ثانیه را انجام دهد و وظایف را در 856 میلی ثانیه به پایان برساند، در حالی که Swoole با 1687 درخواست در ثانیه و 593 میلی ثانیه برای تکمیل کارها انجام می دهد.
در حال حاضر Laravel Octane از Lumen پشتیبانی نمی کند، بنابراین ما نمی توانیم عملکرد Lumen را هنگام اجرا با استفاده از Swoole مشاهده کنیم. اما، بر اساس اعداد بالا، عملکرد Swoole کمی بهتر از میکرو فریمورک Lumen است.
همان طور که می دانیم Lumen در سال 2015 به عنوان یک نسخه سبک تر و سریع تر از لاراول عرضه شد. هدف این بود که بتوانیم از آن در زمانی که سرعت در یک پروژه یا API بسیار مهم است استفاده کنیم. از آن زمان به بعد، لاراول سریع تر و سریع تر می شود و چیزهای جدیدی مانند Laravel Octane ظاهر شده است که در واقع آن را سریع تر از Lumen میکند.
بنابراین برای پاسخ به این سوال که آیا امروز باید از Lumen استفاده کرد؟ تیلور در توییتی این طور پاسخ می دهد که اگر به کمی افزایش سرعت نسبت به لاراول ساده نیاز دارید، پیشنهاد می کنم از Laravel Octane استفاده کنید. این ترکیب سریع تر از Lumen است.
لاراول برای 80٪ موارد استفاده به اندازه کافی سریع است، اما مواقعی وجود دارد که واقعا به عملکرد اضافی نیاز دارید و Laravel Octane راه حل آن است.
پس از دیدن توانایی های Swoole از اعداد بالا، چه فکر می کنید؟ آیا ارزش امتحان کردن را دارد؟ توجه داشته باشید که ویژگی های Laravel Octane فقط محدود به سرویس دادن روی سرور Swoole نیست. در عوض، Laravel Octane دارای ویژگی های زیادی است که Swoole از آن ها پشتیبانی می کند، بنابراین برنامه را سریع تر و کارآمدتر می کند. امیدوارم این مقاله و مقایسه به شما کمک کند تا متوجه شویدLaravel Octane و Swooleدر پروژه چه کاری می تواند انجام دهد.
منبع ها
https://laravel.com/docs/8.x/octane
https://github.com/laravel/octane
https://beyondco.de/blog/laravel-octane-introduction
https://laravel-news.com/laravel-octane
https://laravel-news.com/laravel-swoole
https://laravel-news.com/should-you-use-lumen-for-a-speed-boost