fpWeb – שלום עולם

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

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

אבל אתם לא חייבים לעשות חלון פרוייקט חדש בLazarusכמוני בשביל לעבוד עם fpWeb. לזרוס 0.9.28x ו FPC 2.4x יעשו את העבודה מצויין באותה מידה.

אז אחרי שהתקנו את התמיכה בfpWeb (נקרא גם fcl-web אם לא הצלחתם למצוא את fpWeb), נוכל לבחור ליצור פרוייקט חדש שהוא CGI, ממגוון של 5 אפשרויות:

  1. מודול Apache
  2. CGI עם DataModule (חלון לא וויזואלי אשר מסייע לנו בעיקר באמצעות האצת הפיתוח שלנו וכcontainer לרכיבים לא וויזואליים)
  3. CGI ללא DataModule
  4. FastCGI עם DataModule
  5. FastCGI ללא DataModule

אני עובד כאן עם FastCGI וDataModule אבל כל מה שאני כותב יעבוד באותה צורה גם עם CGI עם DataModule. ההבדל הוא בקוד הפרוייקט עצמו שמחליט מה סוג האפליקציה (CGI/FASTCGI) וזה על ידי שינוי שם היחידה בסה"כ. לגבי מודול Apache, אין לי ניסיון נוכחי איתו לכן אינני יודע אם הוא זהה או לא בגישה שלו, אך אני מניח שכן.

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

יש לנו עכשיו 2 דרכים להמשיך מכאן:

  1. ליצור path_info שנקרא לו hello world
  2. לקבל כל בקשה ולפעול בהתאם לרצונות שלנו.

אני אבחר באופציה של האפשרות הראשונה שהזכרתי, היות והרבה Micro Framework אוהבים לעבוד בעריכת פעולותשיטה הזו (מעתיקים מסינטרה הרבה פעמים). החיסרון של העבודה בגישה הזו עם fpWeb הוא בכך שאנחנו מוגבלים בשמות שאנחנו יכולים לספק לכל חלק כזה, אבל היתרון הוא שאפשר באותה מידה גם להשתמש בפרמטר עם השם ולא חייבים בהכרח להשתמש בגישת path_info, כך שחשוב להבין את היתרונות והחסרונות של השיטה של fpWeb בנושא הזה במידה ובחרנו באפשרות הראשונה שהצעתי כמובן.

אנחנו ניצור את הגישה של ה path_info על ידי עבודה עם Object Inspector כאשר בחרנו בחלון כמובן ה Data Module, ונשתמש בתכונה של Actions. לחיצה על כפתור עם שלושת הנקודות (או לחיצה כפולה על התכונה), יפתחו לנו חלון חדש של "פעולה" חדשה. הפעולה היא בעצם הpath_info שלנו. שימו לב שהשם שלה (שגם נשתמש בו בתוך ה path_info) הוא שם פסקל לכל דבר ועניין, וזו ההגבלה שלנו בעצם.

אתן לו שם של hello_world, ואתם גם יכולים לסמן אותו כ default אבל לא חייבים כאן להסבר הנוכחי. לאחר מתן השם, נעבור ללשונית של Events ב Object Inspector ונבחר באירוע של OnRequest. הוא יפתח לנו מתודה בתוך העורך טקסט:

procedure TFPWebModule1.TFPWebActions0Request ( Sender : TObject;
ARequest : TRequest; AResponse : TResponse; var Handled : Boolean ) ;

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

בתוך המתודה, נכתוב את הקוד הבא:

procedure TFPWebModule1.TFPWebActions0Request ( Sender : TObject;
ARequest : TRequest; AResponse : TResponse; var Handled : Boolean ) ;
begin
 AResponse.ContentType := 'text/html;charset=utf-8';
 AResponse.Content     := '<html><body>Hello World!</body></html>';
 Handled               := true;
 //AResponse.SendResponse; // <- FastCGI on FPC 2.4x and prior only
end;

במידה ואתם עובדים עם גרסת 2.4x של FPC, יש להוריד את ההערה של Aresponse.SendResponse. בגרסאות חדשות יותר (גרסת פיתוח בזמן כתיבת הפוסט) Handled כבר יעשה את זה עברינו. התוספת הזו היא רק ל FastCGI ולא עבור CGI, אשר שם Handled כבר מבצע את הפעולה עבורינו.

עכשיו נהדר את התוכנה שלנו, וניקח את קובץ הריצה שנוצר לספרייה של cgi שיצרנו עבורו במערכת ונשנה לו את השם ל hello.fcgi.

במידה ואתם עובדים עם אפצ'י, הנה דוגמא להגדרות שאתם צריכים:

<VirtualHost *:80>
  ServerAdmin webmaster@dummy-host2.example.com
  DocumentRoot "/tmp/"
  ErrorLog "/var/log/httpd/dummy-host2.example.com-error_log"
  CustomLog "/var/log/httpd/dummy-host2.example.com-access_log" common
  ScriptAlias /cgi/ /tmp/cgi/

  <Directory /tmp/cgi>
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    AddHandler fcgid-script .fcgi
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>

  FastCgiServer /tmp/cgi/hello.fcgi -idle-timeout 3
</VirtualHost>

חשוב לזכור שבעוד שFastCGI הוא Process נפרד בתוך שרת ה HTTP, מימוש של CGI יטען כל קריאה אליו. ולכן בזמן פיתוח אני אישית ממליץ לעבוד עם CGI ורק כאשר הכל עובד אתם יכולים להמיר את זה בקלות לFastCGI. היות וכל שינוי ל FastCGI דורש מאפצ'י להריץ מחדש את הProcess שכבר רץ מההתחלה, ולכן הוא לא יעדכן אותו.

לאחר מכן, יש לגשת בדפדפן אל הפרוייקט שלנו בצורה הבאה:

http://127.0.0.1/cgi/hello.fcgi/hello_world

ולהנות מהתוצאה.

2 מחשבות על “fpWeb – שלום עולם

  1. ארתיום

    שים לב שיש הבדל מהותי בעבודה בתור cgi ובתור fastcgi ואני לא מדבר רק על ביצועים.

    כשאתה עובד עם FastCGI תהליך אחד מטפל בהרבה בקשות. אני לא יודע אם במקרה של fpWeb הוא יודע לנהל thread-pool או שהוא single-threaded בכל אופן הגישה למשאבים צריכה להיות שונה.

    למשל, כשאתה עובד כ־FastCGI אני יכול לעשות cache להרבה מאוד דברים מועילים, בפרט למשל מידע משותף קשרים ל־DB, לכן דווקא לכל מי שמפתח יישום FastCGI עדיף לעבוד איתו בתור יישום FastCGI.

    בנוסף אתה יכול להגדיר יישום FastCGI (לפחות בד"כ כן לא יודע לגבי fpWeb) כשרת חיצוני שמאזין לבקשות בפורט TCP מסוים או Unix-Domain-Socket ושרת HTTP לא מנהל לו את ה"חיים" כך שאתה יכול להריץ ולדבג את היישום ככל יישום אחר, להוריד אותו להעלות מחדש.

    למשל, עבור CppCMS יש לי סקריפט פשוט שמאפשר להעלות שרת HTTP ויישום או לעשות את זה בנפרד כך שאפשר לדבג את היישום בקלות

  2. ik_5 מאת

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

    אני יודע שיש עבודה לגרום ל fpWeb לעבוד עם טרדים, אני לא יודע מה הסטטוס שלה, היא עדיין בפיתוח. סתם לדוגמא אתמול אחרי שכתבתי את הפוסט, שינו וויזואליות לאירועים שקושרים לניתוח ה template, מ public ל published. כלמור שאפשר לראות אותן ב Object Inspector וזה לא מחייב הגדרה ידנית בלבד.

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

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s