PHP + Apache לעומת Node.js

 

מאמר זה תורגם מאנגלית על ידי עמיחי היינס.

במקור זה מאמר של תומס האנטר.

 

זאת השוואה של תפוחים לתפוזים. PHP היא שפה בוגרת, פועלת מאחורי שרת האינטרנט Apache בתצורה של בקשה / תגובה. Node.js הוא מסגרת מבוססת JavaScript המריצה לולאת אירואים לא חוסמים ואשר פועלת בתוך מנוע V8, עם שרת אינטרנט אופציונלי הבנוי בתוכו ואז שוב, האם זה באמת השוואה של תפוחים לתפוזים? שתי הטכנולוגיות משמשות בדרך כלל להגשת דפי אינטרנט לדפדפנים.

 

אם אתם עוקבים אחרי הבלוג שלי לאורך השנים, הייתם יודעים שאני מעריץ גדול של PHP. השגתי את תעודת ה- PHP5 ZCE (מהנדס מוסמך Zend) לפני כמה שנים. בניתי כמה מאות אתרים מבוססי תוכן באמצעות מערכות ניהול תוכן שונות, כמו גם תריסר יישומים באמצעות מסגרות PHP שונות. היה לי ארוע מוצלח ב – 2011 ZendCon, ואפילו לימדתי Meetup PHP במשך כתשעה חודשים.

 

אם היית קורא את הבלוג שלי בזמן אחרון, היית גם שם לב שאני לא סותם את הפה על הדבר החדש הזה שנקרא Node.js שזה (JavaScript שלא על הדפדפן). טוב, ללא ספק, אני לא זרקתי שנים של ניסיון שלי ב- PHP לילד החדש בבלוק, נכון?

 

בכנות, אני כבר משתמש בשתי השפות לאחרונה. בעבודה אתרי האינטרנט שלנו בנויים באמצעות PHP (למרות שאני מוצא עוד סיבות לNode.js כל יום). לעבודות צדדיות שלי, אני כותב משחקי אינטרנט מרובי משתתפים ותוכנות התממשקות חומרה באמצעות Node.js.

 

לשתי הסביבות יש יתרונות וחסרונותיהם משלהם, ואף שפה היא הפתרון המושלם לכל פרויקט. בפוסט הזה אני הולך להשוות ולעמת את שתי סביבות, המכסה את נקודות החוזק והחולשה שלהם, ומתווה מי הוא טוב יותר למצבים שונים.

 

למה אני רק מכסה PHP + אפצ'י וNode.js? בכנות, אלו השפות שאני יודע הכי טוב ויש לי קוד ייצור פועל עבור כל אחד. Ruby, Python הן כמה שפות גדולות באותו מרחב זה עם עוצמות וחולשות דומות, אבל לא היתה לי ההזדמנות ללמוד אותם. JavaScript (Node.js) ו-PHP מכילות השפעות תחביריות גדולות משפת C.

 

יתרונות של PHP

 

PHP היא ללא ספק השפה הנפוצה ביותר בצד שרת לתכנות באינטרנט. זה ישן, ואף פעם אין מחסור של ספקי ארוח משותפים זולים. חלק מהפלטפורמות הגדולות/היישומים נוהגים להשתמש PHP. וורדפרס, הפופולרי ביותר מבין פלטפורמות בלוגים עצמאיים המתארחים כתובה ב PHP וגם MediaWiki, Joomla, הן כמה דוגמאות ליישומים נפוצים המשתמשים ב-PHP.

 

חלק מאתרי האינטרנט הגדולים ביותר משתמשים ב- PHP, כגון פייסבוק, ויקיפדיה. PHP משתמש במתודולוגיות מסורתיות (זאת אומרת – מוכרות) כמו תכנות מונחה עצמים. יש המון מסגרות אינטרנט PHP ותיעוד שלהן ושל השפה.

 

PHP היא נהדרת עבור שרת של אתרי תוכן. PHP יושב מאחורי שרת אינטרנט, שיכול לבדוק אם הקובץ המבוקש קיים במערכת הקבצים. אם כן, הקובץ יכול להיות מוגש ללקוח ללא צורך להפעיל קוד PHP. זה לא בהכרח יתרון של השפה עצמה, אבל זו תוצאת לוואי מועילה עבור רוב המצבים.

 

PHP יש גם גיבוי של חברה מסחרית על ידי חברת זנד (הסלוגן שלהם הוא "חברת ה- PHP"). גיבוי זה נדרש על ידי תאגידים גדולים, שחולק את אותה הפילוסופיה, "אם משהו לא עולה כסף אנחנו לא רוצים אותו".

 

חסרונות של PHP

 

PHP  לא אמורה לרוץ למשכי זמן ארוכים. רבים יתווכחו איתי כאן, אבל בברירת המחדל מוגדר להפסיק את עצמו ברגע שהוא כבר פועל במשך 30 שניות, או אם הוא מגיע לכמות מסוימת של שימוש בזיכרון. אפשר לכבות את ההגדרות הללו, ויישומים יכולים להיות בנויים לרוץ במשך זמן רב בהצלחה, אבל זה לא התחום שבו PHP מתבלט לטובה.

 

השפה לא מסוגלת להפעיל קוד במקביל. אתה יכול, תוך שימוש בכלים כמו Gearman, להעביר חלק מהעבודה לתהליכים אחרים, ודי לפקוח עין על ההתקדמות, אבל התהליך הזה די מקרטע, ולא מה שPHP מיועד להיות. Gearman עצמו מציע מגוון גדול של אפשרויות וניתן להשתמש בו בסביבות שונות, כולל Node.js.

 

בימים עברו, כאשר היה מיפוי של 1:1 בין כתובות ומערכות קבצים, זה נראה הגיוני לגמרי שיש שרת אינטרנט נפרד מהשפה שהוא מריץ. אבל כיום, כל יישום PHP עם כתובות יפות פועל מאחורי שרת האינטרנט Apache צריך קובץ .Htaccess, שמבקש מהשרת לתרגם ביטוי של כתובת לקובץ בעזרת regex. נשמע מורכב ומסורבל עם תקורה מיותרת? זה בגלל שזה באמת ככה.

 

בסך הכל, המערכת הנדרשת לתמוך ב- PHP היא מורכבת יתר על מידה בהשוואה למשהו פשוט כמו node. קודם כל צריך אפצ'י, שבו יש כמה הגדרות גלובליות, כמו גם הגדרות אתר ספציפיות. צריך גם PHP, שבו יש הגדרות php.ini  גלובליות, שחלקם יכול להיות מבוטל בזמן ריצה (אך לא הכל). יש גם חבורה של דברים ישנים שהשאירו בסביבה ויש להסיר, למשל, תמיכת Y2K (לבסוף הוסר ב5.4).

 

האתר הרשמי הוא די מכוער ומיושן. המסמכים הם בסדר, המשתמשים תרמו הערות מועילות מאוד, עם זאת השיטה לעדכן מסמכים כרוכים SVN והאקינג בקבצי XML, ולא בדיוק מעודד עבור רוב האנשים כדי לכתוב תיעוד.

 

ניהול חבילות הוא כמעט לא קיים. בטח, יש PEAR, אבל הכלי מעצבן לשימוש עד כדי גיחוך. כמה מנהלי חבילות אחרים הופיעו, למשל Pyrus (PEAR2) ו- Packagist, אבל השימוש בהן כל כך נדיר שאין סטנדרט דה פקטו. ולומר את האמת, כנראה שלעולם לא יהיה. יש גם PHPClasses.org, אבל האתר הזה לא נוח לשימוש ומחייב את המשתמש להירשם כדי לגלוש.

 

מאז שתהליך PHP מתחיל, ומבצע כמה תהליכים קבועים ואחר כך  מבצע את המשימה שהמשתמש בעצם רוצה, ולאחר מכן מת, נתונים אינם נשמרים בזיכרון. אתה יכול לשמור את הנתונים באופן מתמשך  באמצעות כלי צד שלישיים כמו מסד נתוני Memcache או בסיס נתונים מסורתי, אבל אז יש את התקורה של תקשורת עם התהליכים חיצוניים האלה.

 

יתרונות של Node.js

 

הכח הגדול ביותר של Node.js, לעניות דעתי, הוא שהוא מונע  אירועים (Event driven). יישומי node רצים נהדר על פני תקופות זמן ארוכות. מנהל האירועים, בעוד די פשוט ביסודו, מספק ממשק חזק ועקבי לביצוע קוד לפי ארועים בעת הצורך.

 

לnode יש שרת אינטרנט מובנה. יש אנשים שחושבים שזה דבר רע, אני קורא לאותם אנשים משוגעים. מאחר שהשרת מובנה אין בכלל את הצורך בדבר המביך הזה שנקרא htaccess config. כל בקשה מנותבת לעבור את אותו תהליך, מבלי לצוד באמצעות מערכת הקבצים ולהבין איזה תסריט צריך לרוץ.

 

צוואר הבקבוק מספר אחד עם יישומי אינטרנט הוא לא הזמן שלוקח לחישוב פעולות רעבות CPU, אלא הרשת, I/O. אם אתה צריך להגיב לבקשת לקוח לאחר ביצוע שיחת מסד נתונים ושליחת דוא"ל, תוכל לבצע את שתי הפעולות ולהגיב

כאשר שתיהם בוצעו במלואם.

 

כמובן, עם Node.js שנכתב ב-JavaScript, אם אתה כבר יודע JS לפיתוח ממשק משתמש, אתה כבר מתמצא די טוב בתחום Node.js. אתה כבר יודע את התחביר,ואת הבעיות של השפה, כל שנותרי הוא להכיראת ה-API  לאינטראקציה עם המערכת.

 

מערכת ניהול החבילות, npm, היא נהדרת (למרות שחסר הרבה כדי שהאתר יהיה שלם). במקום לעקוב אחרי הנחיות קפדניות ודרישות עיצוב (כמו ב-PEAR של PHP למשל), כל אחד יכול לשים כל דבר לnpm (אפילו אני!). זה דומה לשוק של אנדרואיד. בטח, אתה יכול לקבל כמה דברים נוראים  משם, אבל אם משתמשים בהיגיון בריא לא תורידו וירוס.

 

כל כך חדש, שאין לו הרבה שאריות מטען מימי קדם. מכיוון שיש שרת מובנה, הערימה היא הרבה יותר פשוטה, יש פחות נקודות כישלון, ויש יותר שליטה על מה שאתה יכול לעשות עם תגובות של HTTP (ניסית אי פעם להחליף את שמו של שרת האינטרנט באמצעות PHP?).

 

ניתן לשמור נתונים בזיכרון בקלות רבה, כך שאם אתה זקוק לשיתוף נתונים בין לקוחות שונים (לדוגמה, במשחק מרובה משתתפים), שיתוף הנתונים הזה מובנה.

 

חסרונות של Node.js

 

Node.js היא פלטפורמה חדשה מאוד, ה-API שלה לא יציב, והיא לא נבדקה ביסודיות. אם אתם עומדים לבנות יישום בקנה מידה של חברה גדולה עם אורך חיים ממושך, Node.js הוא לא פתרון טוב. ה-API של node משתנה כמעט מדי יום  ויהיה צורך לכתוב מחדש לעתים קרובות יישומים גדולים/ארוכי טווח.

 

אם אתה משרת הרבה קבצים סטטיים, כגון תמונות, אתה לא רוצה להשתמש Node.js, אחרת אתה תחזור למצב שבו אתה בודק במערכת הקבצים אם דברים קיימים. ניתן לתקן בעיה זו על ידי העברה של תוכן סטטי לתת דומיין או לשרות העברת תוכן.

 

JavaScript רחוקה מלהיות שפה מושלמת, היא נוצרה במשך תקופה של 10 יום. אם אתה מפתח הרגיל להשתמש במחלקות (class), להתרגל לשפת תכנות פונקציונלית יכול להיות כואב. להתרגל לתכנות אסינכרוני יכול גם להיות קשה.

 

הזיכרון המתמשך יכול להיות קצת מסובך. אם אתה לא יודע מה אתה עושה, אתה עלול בטעות לשתף נתונים בין לקוחות (שיכול להיות אסון). כמו כן, נמצאים בסכנה גדולה יותר של דליפות זיכרון. אם אתה ממשיך לצרף נתונים למערך ב-PHP, התסריט רץ באמת רק 0.1 שניות, אבל תסריט Node.js צריך לפעול לנצח, ואתה יכול בקלות לפוצץ אותו על פני תקופה של זמן.

 

node מתשמש ב-thread אחד, למרות שזה נראה מרובה הליכים עם ביצוע אסינכרוני שהוא עושה. זה באמת לא משנה יותר מדי, מתי בפעם האחרונה צוואר הבקבוק הגדול ביותר של האפליקציה שלך היה מעבד במקום לחכות ברשת לקריאות I/O? אז, בזמן שזה יהיה מגניב להיות ריבוי תהליכים(multi-threaded), זה בדרך כלל לא יפגע ביישום.

 

איזה אני צריך ללמוד?

זו שאלה גדולה. אם אין לך שום ניסיון בפיתוח תוכנה בצד שרת, אתה כנראה צריך להתחיל עם PHP. זו שפה נהדרת, קלה לביצוע בדפוס הבקשה -> תגובה שהופך את האינטרנט חסר המצב לגדול. אתה בוודאי תוכל למצוא יותר הודעות פורום מאנשים שיש להם אותה הבעיה כמוך (למרות שההודעות יכולות להיות בנות 10 שנים).

 

אם אתם מחפשים לבנות סוגים אחרים של תוכנה, Node.js עשויה להיות הימור בטוח. לדוגמה, אני כותב כמה תוכנות שדורשות קוד שיופעל על ידי שינויים שנעשו בחומרה, כגון רשת אלחוטית מגיעה לטווח. כתיבה של סוג כזה של תוכנה באמצעות PHP יהיה האקי וכואב, אך עם Node.js הוא משב רוח מרענן.

 

ככל הנוגע לעמידות לעתיד, אני לא משוכנע שאף אחת מהשפות תעמוד במבחני הזמן. העתיד של אפליקציות אינטרנט הוא כנראה יישומי עמוד אחד, שבו כמויות קטנות יותר של נתונים נשלחות אל מעבר לגדר וממשק הלקוח הוא האחראי על יצירת ה-HTML, באמצעות שימוש בwebsockets. לעומת זאת,PHP  לא יכול לעשות websockets כמו ש- Node.js יכול. עם זאת, מוקדם מדי לקבוע אם Node.js ינצח במלחמת השפות האסינכרוניות מונחות הארועים. בשל הפגמים העיקריים של JavaScript, שפה טובה יותר יכולה בקלות לבעוט בתחת שלה.

 

מצבים לדוגמה

הנה כמה דוגמאות מהירות של מצבי תכנות שונים ואיזו שפה אתה כנראה מתאימה להם.

 

האם אתה בונה איזה דמון? השתמש node.

האם אתה עושה אתר תוכן? השתמש ב-PHP.

האם ברצונך לשתף נתונים בין מבקרים? השתמש node.

האם אתה מתחיל מחפש לעשות אתר מהיר? השתמש ב-PHP.

האם אתה מתכוון להפעיל כל מיני קטעי קוד במקביל? השתמש node.

האם אתה כותב תוכנה עבור לקוחות שתרוץ על מארחים משותפים? השתמש ב-PHP.

האם אתה רוצה לדחוף אירועים משרת ללקוח באמצעות websockets? השתמש node.

האם צוות שלך כבר יודע PHP? השתמש ב-PHP.

האם צוות שלך כבר יודע JavaScript  בדפדפן? node תהיה קלה יותר ללמוד.

האם אתה בונה סקריפט שורת פקודה? שניהם עובדים.

 

משוואה פשוטה

הנה דרך מצחיקה להסתכל על דברים … כדי לחקות את הפונקציונליות של Node.js באמצעות PHP + אפצ'י, היית צריכים כמה שירותים אחרים הפועלים בנוסף. כדי ש node תפעל כמו PHP, היית פשוט כותב קוד סינכרוני.

 

Node.js ≈ PHP + Apache + Memcached + Gearman – complexity