Polling API نادیدهگرفتهشدهترین بهروزرسانی PHP است
PHP 8.6 شامل یک بهروزرسانی بیسروصدا است که همهچیز را در زمینه شبکهسازی با همروندی (concurrency) بالا تغییر میدهد.
در حالی که بسیاری از توسعهدهندگان درباره generics بحث میکردند، Polling API با هیاهوی بسیار کمی از مرحله RFC گذشت. این قابلیت مورد حمایت چهرههای کلیدی مانند خالق FrankenPHP و نویسنده Composer قرار گرفت.
سالها بود که PHP به stream_select() متکی بود. این ابزار از یک فراخوانی سیستم (system call) متعلق به سال ۱۹۸۳ استفاده میکند. این ابزار سه نقص اصلی دارد:
- در اکثر سیستمها به محدودیت ۱۰۲۴ توصیفگر فایل (file descriptor) برخورد میکند.
- از پیچیدگی O(n) استفاده میکند، به این معنی که با افزایش تعداد اتصالات، عملکرد کاهش مییابد.
- دسترسی به ابزارهای مدرن مانند
epollدر لینوکس یاkqueueدر macOS را ندارد.
به همین دلیل است که کتابخانههای async مانند AMPHP یا ReactPHP برای عملکرد خوب به افزونههای اضافی مانند ext-uv نیاز داشتند. PHP فاقد زیربنای بومی برای شبکهسازی در مقیاس بالا بود.
Polling API این شکاف را پر میکند.
این قابلیت فضای نام Io\Poll را معرفی میکند. این API بهطور خودکار بهترین بکاِند (backend) را برای سیستم شما انتخاب میکند. از epoll در لینوکس، kqueue در macOS و event ports در Solaris استفاده میکند. نیازی نیست این جزئیات را مدیریت کنید.
نحوه عملکرد آن در عمل به این صورت است:
شما یک Context ایجاد میکنید.
یک استریم را در یک StreamPollHandle میپیچید.
آن را همراه با رویدادهایی که میخواهید زیر نظر بگیرید، به context اضافه میکنید.
تابع wait() را فراخوانی میکنید تا فقط محرکهایی (triggers) را که واقعاً رخ دادهاند، دریافت کنید.
این یک حلقه رویداد (event loop) کامل نیست؛ بلکه یک ابزار سطح پایین (low-level primitive) است. این قابلیت زیرساختی را فراهم میکند که به حلقههای رویداد اجازه میدهد سریعتر و قابلاعتمادتر اجرا شوند.
جادوی واقعی در لایههای داخلی است. این API به هسته PHP و افزونهها اجازه میدهد از یک رابط کاربری (interface) واحد استفاده کنند. این قابلیت امکانات زیر را فراهم میکند:
- مدیریت کارآمد سیگنال برای FrankenPHP.
- مدیریت بهتر رویدادها در PHP-FPM workers.
- رابطهای استاندارد برای sockets و curl.
- حالتهای edge-triggered با کارایی بالا.
مردم اغلب میگویند PHP نمیتواند مقیاسپذیر باشد. برای مدتی طولانی، این ادعا دلیل فنی داشت. PHP دسترسی بومی به ابزارهای polling مورد استفاده در Nginx یا Go نداشت.
با PHP 8.6، این بهانه از بین رفته است.
بهترین تغییرات زیرساختی اغلب نامرئی هستند. شما متوجه epoll نمیشوید؛ فقط متوجه میشوید که یک سرور ده هزار اتصال را بدون کوچکترین زحمتی مدیریت میکند.
Polling API همان کارِ کمزرقوبرقی است که سقف توانمندی کل اکوسیستم را بالا میبرد.
منبع: https://dev.to/juststevemcd/the-polling-api-is-the-most-underrated-rfc-php-has-shipped-in-years-2d32
