ReactPHP: یک لایبرری اپن‌سورس برای برنامه‌نویسی Event-Driven در PHP


اجرای برنامه‌ها در زبان برنامه‌نویسی پی‌اچ‌پی به صورت اصطلاحاً Blocking انجام می‌شوند. برای مثال، زمانی که چند ریکوئست به صورت هم‌زمان به دیتابیس ارسال می‌شود، اولین ریکوئست پردازش شده اما اجرای دستورات بعدی به ريسپانس بازگشتی از دیتابیس وابسته است و چنین روندی به نوعی معقول به نظر می‌رسد اما این رویکرد موجب کاهش سرعت اجرای برنامه‌ها در پی‌اچ‌پی می‌گردد که در همین راستا قصد داریم تا یک لایبرری اپن‌سورس را معرفی کنیم که امکان توسعهٔ وب اپلیکیشن‌هایی را برای دولوپرهای پی‌اچ‌پی فراهم می‌کند که به صورت اصطلاحاً Non-Blocking اجرا می‌شوند.

ReactPHP بر اساس یک مدل Event-Driven و Non-Blocking پیاده‌سازی شده است به طوری که هیچ‌کدام از عملیات I/O در آن بلاک نمی‌شوند بلکه به شیو‌ه‌ای موازی و کانکارنت اجرا می‌شوند و از همین روی در این لایبرری Event Loop، که وظیفۀ هندل کردن فانکشن‌ها را بر عهده دارد، توابعی که برای اجرا فراخوانی می‌شوند را وارد Call Stack می‌کند که پس از اجرا این فانکشن‌ها یکی پس از دیگری از اِستک خارج شده و برای اجرای مجدد وارد صف Callback می‌شوند و در این صف هم این فانکشن صبر می‌کند تا اِستک فراخوانی فانکشن‌ها خالی شود، زیرا تنها یک دستور می‌تواند در آنِ واحد اجرا شود و از همین روی هم Event Loop به صورت سَنکرون هر یک از ایونت‌ها را هندل می‌کند (Synchronous در لغت به معنای هم‌زمان است.)

همچنین باید گفت که Event Loop (حلقۀ رویداد) کامپوننت مرکزی و کلیدی لایبرری ReactPHP است و سایر بخش‌های این لایبرری بر پایۀ آن پیاده‌سازی شده‌اند به طوری که این حلقه مسئول زمان‌بندی عملیات آسنکرون (کانکارنت) در برنامه است. معماری Event-Driven (مبتنی بر رویداد) موجب می‌شود تا این لایبرری برای هزاران کانکشن کانکارنتی که از سمت کلاینت‌ها به سرور ارسال می‌شوند مناسب باشد مضاف بر اینکه برای اپلیکیشن‌هایی کاربرد دارد که اجرای آن‌ها مدت‌ زمان طولانی را می‌طلبد یا اپلیکیشن‌هایی که در آن‌ها نیاز است تا چندین تَسک هم‌زمان و به صورت Non-Blocking اجرا شوند به طوری که سیستم هرگز برای به پایان رسیدن عملیات I/O منتظر نمی‌‌ماند (لازم به ذکر است که رویداد یا ایونت به هرگونه عملیاتی در سیستم گفته می‌شود که دولوپر بتواند به آن پاسخ دهد که از آن جمله می‌توان اتمام عملیات خواندن یک فایل، دریافت ریسپانس از اجرای یک فرآیند و غیره را نام برد.)

ReactPHP را به نوعی می‌توان معادلی برای Node.js قلمداد کرد چرا که فیچرها این پلتفرم را توانسته به زبان PHP بیفزاید (برای آشنایی بیشتر با نودجی‌اس، می‌توانید به مقالهٔ Node.js چیست؟ مراجعه نمایید.) روی هم رفته، این لایبرری از کامپوننت‌های دیگری نیز تشکیل شده است که هر یک از آن‌ها یکسری ویژگی خاصی ارائه می‌دهند که برخی از مهم‌ترین آن‌ها عبارتند از:

- ارائۀ اینترفیسی برای پردازش مؤثر حجم عظیم دیتای ردوبدل شده به صورت آسنکرون بدون نیاز به ذخیرۀ آن در حافظۀ سیستم (Asynchronous در لغت به معنای غیرهم‌زمان است.)
- افزایش سرعت لود وب اپلیکیشن با فراهم کردن امکان استفاده از DNS به صورت کانکارنت و Non-Blocking (دی‌ان‌اس به منظور تبدیل نام دامنۀ وب‌سایت به آدرس آی‌پی استفاده می‌شود.)
- امکان ارسال چندین ریکوئست HTTP از سمت کلاینت به سرور و دریافت ریسپانس به صورت کانکارنت
- امکان برقراری تعامل مابین پردازش‌های مختلف به منظور اطلاع از اتمام یک ایونت و یا جریان‌های I/O

آشنایی با ویژگی‌های بارز ReactPHP
به طور کلی، لایبرری‌های به اصطلاح Third-party نیز می‌توانند از کامپوننت‌های این لایبرری برای ایجاد ارتباط کلاینت/سرور استفاده کنند که پردازش‌ها در آن به شکل Non-Blocking اجرا می‌شوند. روی هم مرفته، برخی از فیچرهای کلیدی لایبرری ReactPHP عبارت‌اند از:

- امکان استفاده از این لایبرری در مقیاس‌ بزرگ
- قابل‌اعتماد و تست‌شده در شرایط مختلف
- پشتیبانی طولانی مدت از نسخه‌های پایدار منتشرشده از این لایبرری
- عدم نیاز به افزونه‌های مختلف در جهت اجرا روی سایر پلتفرم‌ها
- قابلیت نصب یکسری افزونۀ اختیاری در آن به منظور ارائۀ عملکرد بهتر
- عملکرد بهتر این لایبرری از برنامه‌های نوشته شده با نسخۀ 7 به بالای زبان پی‌اچ‌پی
- قابلیت پشتیبانی از کدهای به اصطلاح Lagecy (قدیمی) زبان پی‌اچ‌پی
- پشتیبانی از ماشین مجازی اپن‌سورس HHVM
- قابلیت استفادۀ مجدد هر یک از کامپوننت‌ها 
- متشکل از پارت‌های به اصطلاح Decoupled (جدا از هم) به طوری که هر یک از آن‌ها را می‌توان با یکسری کُد پیاده‌سازی شدۀ دیگر جایگزین کرد.
- برخورداری از قابلیت Unit Test و Functional Test (به طور خلاصه، مورد اول برای تست هر یک از قطعه کدهای کوچک برنامه به کار می‌رود و مورد دوم نیز عملکرد کلی اپلیکیشن را مورد بررسی قرار می‌دهد.)
- مبتنی بر استاندارد PSR
- امکان استفاده از این لایبرری در پکیج اپلیکیشن‌های مختلف

در حقیقت چیزی که ReactPHP را از سایر لایبرری‌های این زبان متمایز می‌سازد، اکوسیستم پویای آن با امکان استفاده از صدها لایبرری Third-party است که امکانی را در اختیار دولوپرها قرار می‌دهد تا بتوانند این لایبرری را در بسیاری از سیستم‌های موجود همچون یکسری API دیگر ادغام کنند.



اکرم امراه‌نژاد