סביבת זמן הריצה של PHP היא מחסנית התוכנה שאחראית להתקנת הקוד של שירות האינטרנט והתלות שלו ולהפעלת השירות.
כדי לציין PHP עבור הסביבה הרגילה של App Engine, צריך להצהיר על זמן הריצה בקובץ app.yaml. לדוגמה:
runtime: phpVERSION
VERSION הוא מספר הגרסה של PHP MAJOR ו-MINOR. לדוגמה, כדי להשתמש בגרסה האחרונה של PHP, PHP 8.5, מציינים 85.
למידע על גרסאות PHP נתמכות אחרות וגרסת Ubuntu התואמת לגרסת ה-PHP שלכם, אפשר לעיין בלוח הזמנים של התמיכה ב-Runtime.
גרסת PHP
הגרסה העדכנית ביותר של PHP שנתמכת היא 8.5. ה-PHP runtime משתמש בגרסה היציבה האחרונה של הגרסה שצוינה בקובץ app.yaml. App Engine מעדכן אוטומטית לגרסאות חדשות של תיקוני אבטחה, אבל לא מעדכן אוטומטית את הגרסה המשנית.
לדוגמה, יכול להיות שהאפליקציה שלכם נפרסה ב-PHP 7.3.0 ומעלה, והיא תעודכן אוטומטית לגרסה 7.3.1, אבל היא לא תעודכן אוטומטית ל-PHP 7.4.0.
הפעלת האפליקציה
תצטרכו לפרוס בקר קדמי כדי לטפל בכל ניתוב הבקשות.
בדוגמאות הבאות מוצגות דרכים שונות להצגת האפליקציה:
אם האפליקציה מכילה קובץ
public/index.phpאוindex.php, App Engine משתמשת בקובץ הזה כדי להציג את האפליקציה.מומלץ להשתמש ב-framework כמו Laravel, Symfony או Slim, כי הוא מספק ניתוב קל משקל לכתיבה ולפריסה מהירה של אפליקציות PHP. דוגמה ל-Slim front controller
עם זאת, אם אתם מעבירים אפליקציה מדור קודם, תוכלו להיעזר בקובץ
index.phpלדוגמה שבהמשך כדי לייבא את קובצי ה-PHP שאתם צריכים ולהטמיע את בקר הקצה באופן ידני:אם מציינים את הרכיב האופציונלי
entrypointבקובץapp.yaml, App Engine משתמש בפקודה שברכיבentrypointכדי להציג את האפליקציה במקום להשתמש בפקודותpublic/index.phpאוindex.php:entrypoint: serve path/to/my/front/controller.phpהשדה
entrypointמשתמש בפקודה המובניתserve, שהיא תוכנית בסביבות הריצה של PHP שמפעילה את ההטמעה שלphp-fpmושרת אינטרנט ברקע. שרת האינטרנט הזה מעביר את כל התנועה לקובץ ה-PHP שצוין באמצעות דפוס העיצוב של בקר קדמי.לפקודה
serveיש שני דגלים אופציונליים:
--workers=N: מציין את מספר העובדיםphp-fpm. אם לא מגדירים את הדגל--workers, הפקודהserveמנחשת את מספר העובדים על סמך כמות הזיכרון שזמינה. כדי לקבל את התוצאות הטובות ביותר, צריך להגדיר את הערכים של הדגל--workersבפקודהserveואת הרכיבmax_concurrent_requestsלאותו מספר.
--enable-dynamic-workers: מציין שרוצים שהתהליכים שלphp-fpmיופעלו רק לפי הצורך. ברירת המחדל היא שימוש במדיניות סטטית עבור העובדיםphp-fpm. אפשר לשנות את המספר המקסימלי של תהליכי worker שנוצרו באמצעות הדגל--workers=N. כברירת מחדל, המספר המקסימלי של תהליכי worker שנוצרים הוא המספר שמוגדר במדיניות הסטטית.
הדגלים האופציונליים צריכים להופיע לפני הנתיב של בקר הקצה:
entrypoint: serve --workers=2 --enable-dynamic-workers path/to/index.phpכדי לפרוס תהליך עובד שפועל לאורך זמן, מגדירים את הרכיב
entrypointלנתיב הקובץ של תהליך העובד:entrypoint: php long-running-worker-file.phpאם האלמנט
entrypointמריץ סקריפט עם תהליך ממושך, כמו Pub/Sub Worker שרשום לנושא, אל תשתמשו בפקודהserve.
מידע נוסף זמין במאמר בנושא app.yaml .
תוספים מופעלים
התוספים הבאים הופעלו בסביבות זמן הריצה של PHP ב-App Engine:
BCMathbz2CalendarcorecgictypecURLdatedbadomenchantExiffcgifileinfofilterFTPGDgettextGMPhashiconvintljsonLDAPlibxmlmbstringMYSQLimysqlndMySQL (PDO)OPcacheOpenSSLPCNTLpcrePDOpgsqlPharposixPostgreSQL (PDO)ReflectionsessionShmopSimpleXMLSOAPSocketssodium (PHP 8.x only, not available for PHP 7.x)SPLSQLite (PDO)SQLite3standardtesttidytokenizerXMLXMLreaderXMLrpc (PHP 7.x only, not available for PHP 8.x)XMLwriterXSLzendZipZlib
תוספים שאפשר לטעון באופן דינמי
אפשר לטעון את התוספים הבאים באופן דינמי על ידי הגדרת php.ini:
כדי להפעיל את התוספים האלה, מוסיפים להם הנחיות בקובץ php.ini מתחת ל-extension, לדוגמה:
extension=memcached.so
extension=grpc.so
extension=protobuf.so
extension=mongodb.so
extension=imagick.so
extension=opencensus.so
extension=redis.so
[opentelemetry]
extension=opentelemetry.so
משתני סביבה
משתני הסביבה הבאים מוגדרים על ידי זמן הריצה:
| משתנה הסביבה | תיאור |
|---|---|
GAE_APPLICATION
|
המזהה של אפליקציית App Engine. המזהה הזה מתחיל בקידומת region code~, למשל e~ לאפליקציות שמוצבות באירופה. |
GAE_DEPLOYMENT_ID |
המזהה של הפריסה הנוכחית. |
GAE_ENV |
סביבת App Engine. ההגדרה היא standard. |
GAE_INSTANCE |
המזהה של המופע שבו השירות שלכם פועל כרגע. |
GAE_MEMORY_MB |
נפח הזיכרון שזמין לתהליך האפליקציה, ב-MB. |
GAE_RUNTIME |
סביבת זמן הריצה שצוינה בקובץ app.yaml. |
GAE_SERVICE |
שם השירות שצוין בקובץ app.yaml. אם לא מציינים שם שירות, ברירת המחדל היא default. |
GAE_VERSION |
תווית הגרסה הנוכחית של השירות. |
GOOGLE_CLOUD_PROJECT |
מזהה הפרויקט ב- Google Cloud שמשויך לאפליקציה. |
PORT |
היציאה שמקבלת בקשות HTTP. |
NODE_ENV (זמין רק בסביבת זמן ריצה של Node.js) |
מגדירים את הערך production כשהשירות נפרס. |
אפשר להגדיר משתני סביבה נוספים בקובץ app.yaml, אבל אי אפשר לשנות את הערכים שלמעלה, למעט NODE_ENV.
פרוטוקול HTTPS ושרתי proxy להעברה
App Engine מסיימת חיבורי HTTPS במאזן העומסים ומעבירה בקשות לאפליקציה. יש אפליקציות שצריכות לקבוע את כתובת ה-IP והפרוטוקול של הבקשה המקורית. כתובת ה-IP של המשתמש זמינה בכותרת הרגילה X-Forwarded-For. אפליקציות שזקוקות למידע הזה צריכות להגדיר את תוכנת ה-framework שלהן כך שתיתן אמון בשרת ה-proxy.
מערכת קבצים
סביבת זמן הריצה כוללת ספרייה /tmp עם הרשאת כתיבה, ולכל שאר הספריות יש הרשאת קריאה בלבד. כתיבה ל-/tmp תופסת זיכרון מערכת. מידע נוסף זמין במאמר בנושא תמיכה ב-tempnam() וב-sys_get_temp_dir().
שרת מטא-נתונים
כל מופע של האפליקציה יכול להשתמש בשרת המטא-נתונים של App Engine כדי לשלוח שאילתות לגבי המופע והפרויקט.
אפשר לגשת לשרת המטא-נתונים דרך נקודות הקצה הבאות:
http://metadatahttp://metadata.google.internal
בקשות שנשלחות לשרת המטא-נתונים צריכות לכלול את כותרת הבקשה Metadata-Flavor: Google. הכותרת הזו מציינת שהבקשה נשלחה בכוונה מפורשת לאחזר ערכי מטא-נתונים.
בטבלה הבאה מפורטות נקודות הקצה שאליהן אפשר לשלוח בקשות HTTP למטא-נתונים ספציפיים:
| נקודת קצה של מטא-נתונים | תיאור |
|---|---|
/computeMetadata/v1/project/numeric-project-id |
מספר הפרויקט שהוקצה לפרויקט שלכם. |
/computeMetadata/v1/project/project-id |
מזהה הפרויקט שהוקצה לפרויקט שלכם. |
/computeMetadata/v1/instance/region |
האזור שבו המופע פועל. |
/computeMetadata/v1/instance/service-accounts/default/aliases |
|
/computeMetadata/v1/instance/service-accounts/default/email |
כתובת האימייל בחשבון השירות שמוגדר כברירת מחדל ומוקצה לפרויקט. |
/computeMetadata/v1/instance/service-accounts/default/ |
מציגה את כל חשבונות השירות שמוגדרים כברירת מחדל בפרויקט. |
/computeMetadata/v1/instance/service-accounts/default/scopes |
רשימה של כל ההיקפים הנתמכים בחשבונות שירות שמוגדרים כברירת מחדל. |
/computeMetadata/v1/instance/service-accounts/default/token |
מחזירה את אסימון האימות שאפשר להשתמש בו כדי לאמת את האפליקציה שלכם ב-Google Cloud APIs אחרים. |
לדוגמה, כדי לאחזר את מזהה הפרויקט, שולחים בקשה אל http://metadata.google.internal/computeMetadata/v1/project/project-id.
בדוגמה הבאה מוצגות דרכים לקרוא לנקודות הקצה של המטא-נתונים באמצעות cURL או ספריית הלקוח של Google Cloud:
סשנים
PHP מספקת שכבת ניהול סשנים שמאפשרת לאפליקציות אינטרנט לשמור מידע על מצב המשתמש בין בקשות. הסשנים ב-App Engine פועלים בדומה לסשנים בכל אפליקציית PHP אחרת.
כדי להגדיר משתנה בסשן של משתמש, אפשר להשתמש בקוד הבא:
session_start();
$_SESSION['Foo'] = 'Bar';
הקוד הבא ידפיס Bar, בבקשה הבאה של אותו משתמש:
session_start();
print $_SESSION['Foo']; // prints Bar
למשכי הפעלה ארוכים יותר, כדאי להשתמש בשירות אחסון חלופי כמו Cloud SQL.
מפתחות מיוחדים של $_SERVER
PHP הופכת את המערך המיוחד $_SERVER[] לזמין בהיקף הבקשה. בנוסף לפרמטרים הרגילים של CGI, App Engine מוסיף כמה מפתחות שימושיים נוספים:
-
GAE_APPLICATION– מזהה הפרויקט של האפליקציה הנוכחית. Google Cloud -
GAE_DEPLOYMENT_ID– המזהה של קוד המקור שנפרס. -
GAE_ENV– סביבת App Engine (רגילה או גמישה) שבה האפליקציה פועלת. -
GAE_INSTANCE– שם המכונה הנוכחית שמופעלת. -
GAE_MEMORY_MB– נפח הזיכרון שזמין לתהליך האפליקציה, ב-MB. -
GAE_RUNTIME– זמן הריצה שצוין בקובץapp.yaml, למשל php72. -
GAE_SERVICE– שם השירות שמוטמע כרגע. -
GAE_VERSION– שם הגרסה שמופעלת כרגע. -
GOOGLE_CLOUD_PROJECT- Google Cloud מזהה הפרויקט. -
HTTP_X_APPENGINE_CITY– שם העיר שממנה נשלחה הבקשה. לדוגמה, בקשה מהעיר מאונטיין ויו יכולה לכלול את הכותרת value mountain view. -
HTTP_X_APPENGINE_CITYLATLONG– קו הרוחב וקו האורך של העיר שממנה הגיעה הבקשה. מחרוזת כזו יכולה להיראות כך: "37.386051,-122.083851" לבקשה מ-Mountain View. -
HTTP_X_APPENGINE_COUNTRY– המדינה שממנה נשלחה הבקשה, כקוד מדינה לפי תקן ISO 3166-1 alpha-2. App Engine קובע את הקוד הזה מכתובת ה-IP של הלקוח. -
HTTP_X_APPENGINE_HTTPS– אימות השימוש ב-HTTPS. -
HTTP_X_APPENGINE_REGION– שם האזור שממנו הגיעה הבקשה. הערך הזה רלוונטי רק בהקשר של המדינה שצוינה במאפייןX-Appengine-Country. לדוגמה, אם המדינה היא "US" והאזור הוא "ca", הקיצור "ca" מייצג את קליפורניה ולא את קנדה. -
HTTP_X_APPENGINE_USER_IP– כתובת ה-IP של הלקוח. שימו לב ש-$_SERVER['HTTP_X_APPENGINE_USER_IP']היא הדרך היחידה שבה האפליקציה יכולה לאחזר את כתובת ה-IP של הלקוח. המשתנה$_SERVER['REMOTE_ADDR']לא זמין ב-App Engine.
הוראות עם ערכי ברירת מחדל חדשים לאתחול
בטבלה הבאה מפורטות הנחיות שערכי ברירת המחדל שלהן שונים מאלה שמופיעים במפרש PHP הרגיל שזמין בכתובת php.net. כדי למצוא את ערכי ברירת המחדל של הנחיות שלא מפורטות בטבלה הבאה, אפשר לעיין בהנחיות php.ini.
| הוראה | ערך ברירת המחדל ב-App Engine |
|---|---|
expose_php |
Off |
memory_limit |
-1 |
max_execution_time |
0 |
error_reporting |
E_ALL & ~E_DEPRECATED & ~E_STRICT |
display_errors |
Off |
display_startup_errors |
Off |
log_errors |
On |
log_errors_max_len |
0 |
ignore_repeated_errors |
Off |
ignore_repeated_source |
Off |
html_errors |
Off |
opcache.enable |
On |
opcache.validate_timestamps |
Off |
opcache.memory_consumption |
32 |
כדי לשנות את ההגדרות של ההוראות האלה שמוגדרות כברירת מחדל, צריך לכלול אותן בקובץ php.ini של האפליקציה.
tempnam() ותמיכה של sys_get_temp_dir()
אפליקציות של App Engine פועלות בארגז חול לאבטחה שבו רק ספריית /tmp ניתנת לכתיבה ומאוחסנת בזיכרון ה-RAM של המופע. לכן, הגרסה של tempnam() ב-App Engine מחזירה קובץ זמני בזיכרון שאפשר לכתוב בו פתרון אחסון קבוע כמו קטגוריות של Cloud Storage.
דוגמה לאופן הכתיבה לקובץ זמני בזיכרון באמצעות file_put_contents() ו-fwrite().
<?php
$dir = sys_get_temp_dir();
$tmp = tempnam($dir, "foo");
file_put_contents($tmp, "hello");
$f = fopen($tmp, "a");
fwrite($f, " world");
fclose($f);
echo file_get_contents($tmp);
הפלט הצפוי מהדוגמה יהיה:
hello world
ניהול יחסי תלות באמצעות Composer
מידע נוסף זמין במאמר ציון יחסי תלות.