זה מה שלמדתי כמפתח PHP סינכרוני על PHP אסינכרוני
עבדתי עם Laravel במשך שנים. השתמשתי ב-PHP סינכרוני. בקשה מגיעה, תהליך רץ, ותגובה יוצאת. מעולם לא נזקקתי ל-async.
ואז קראתי על ה-Polling API החדש של PHP 8.6. זה שינה את הדרך שבה אני תופס את האופן שבו PHP מטפל במשימות.
הנה הפירוט של איך async עובד.
הבעיה עם Blocking I/O
כשאתה קורא ל-API, הקוד שלך ממתין.
דוגמה: $response = Http::get('https://api.example.com');
אם ה-API הזה לוקח 300ms, תהליך ה-PHP שלך לא עושה כלום במשך 300ms. הוא נמצא במצב שינה (sleep state). הוא תופס זיכרון ומחזיק תור של worker. אם כל ה-workers שלך ישנים, השרת שלך יפסיק לקבל בקשות חדשות.
הפתרון האסינכרוני (Async)
Async מאפשר לך לבצע עבודה אחרת במהלך אותם 300ms. במקום לחכות, אתה מריץ משימות אחרות.
אבל איך אתה יודע מתי הנתונים מגיעים? כאן נכנס ה-kernel לתמונה.
האבולוציה של Polling
select()ל-PHP יש אתstream_select()מאז PHP 4. היא שואלת את ה-kernel: "האם יש נתונים מוכנים ב-sockets האלו?" הבעיה היא ה-"rescan tax". אם יש לך 10,000 חיבורים, אתה חייב לשלוח את הרשימה כולה ל-kernel בכל פעם. זה איטי ופוגע בביצועים.epoll/kqueueזוהי תכונה של ה-kernel, לא תכונה של שפת התכנות. Linux משתמשת ב-epoll. macOS משתמשת ב-kqueue. במקום לסרוק רשימה מלאה, ה-kernel מנהל "רשימת מוכנות" (ready-list). הוא רק אומר לך אילו sockets ספציפיים מכילים נתונים. זה מאפשר סקייל לאלפי חיבורים ללא עלות נוספת.Fibers (PHP 8.1) Fibers מאפשרים לך להשהות (pause) פונקציה בכל נקודה ב-call stack. Fiber לא מתעורר מעצמו. זה כמו סרטון YouTube מושהה. מישהו חייב לקרוא ל-
$fiber->resume()כדי להפעיל אותו שוב.
החוליה החסרה: PHP 8.6
Async I/O דורש שלושה חלקים: • השהיה (Pause): Fibers (כעת ב-PHP core) • החלטה (Decide): ה-Event Loop (קוד PHP רגיל) • ידיעה (Know): Kernel Polling (הפער)
עד עכשיו, ל-PHP לא הייתה דרך מובנית (native) "לדעת" איזה socket מוכן מבלי להשתמש בכלים ישנים או בתוספי C (C extensions).
PHP 8.6 סוגרת את הפער הזה. היא מביאה Polling API מובנה לליבה (core). היא תשתמש אוטומטית ב-epoll ב-Linux וב-kqueue ב-Mac.
התמונה הגדולה
Async הוא לא קסם. Event loop הוא פשוט קוד PHP שמחליט מתי לקרוא ל-resume() על Fiber.
Fibers מספקים את היכולת להשהות.
epoll מספק את האינטליגנציה לדעת מתי להפסיק את ההשהיה.
אם אתה משתמש רק ב-PHP סינכרוני, אתה לא צריך לשנות את אפליקציות ה-Laravel שלך היום. אבל הבנת המודל הזה הופכת ספריות async כמו ReactPHP או Amp להרבה יותר קלות לשליטה.
תבנה, אל תסתפק רק בצריכה. הרץ את הקוד בעצמך כדי לראות איך הוא עובד.
