פיתוח אפליקציה ב-PHP

מזהה אזור

REGION_ID הוא קוד מקוצר ש-Google מקצה על סמך האזור שבוחרים כשיוצרים את האפליקציה. הקוד לא תואם למדינה או למחוז, למרות שחלק ממזהי האזורים עשויים להיראות דומים לקודים נפוצים של מדינות ומחוזות. באפליקציות שנוצרו אחרי פברואר 2020, המחרוזת REGION_ID.r כלולה בכתובות ה-URL של App Engine. באפליקציות קיימות שנוצרו לפני התאריך הזה, מזהה האזור הוא אופציונלי בכתובת ה-URL.

מידע נוסף על מזהי אזורים

בקישור הבא מוסבר איך ליצור אפליקציה ב-App Engine באמצעות PHP גרסה 7.4 או 8.1. אפליקציית הדוגמה מאפשרת למשתמשים לפרסם בדף אינטרנט את השמות, המחברים, התיאורים, תאריך הפרסום והתמונות של הספרים האהובים עליהם. האפליקציה מאחסנת את נתוני הטקסט במסד נתונים של Cloud SQL ואת התמונות בקטגוריה של Cloud Storage.

מבנה המדריך

  1. יצירת פרויקט Google Cloud באמצעות Google Cloud CLI

  2. הורדת האפליקציה לדוגמה

  3. ציון יחסי תלות באמצעות composer.json

  4. הפעלת האפליקציה והגדרת בקרי קצה

  5. שילוב עם שירותי Google Cloud

  6. הגדרת האפליקציה ל-App Engine

  7. פריסת האפליקציה

לפני שמתחילים

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Build API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  5. התקינו את ה-CLI של Google Cloud.

  6. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  7. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Cloud Build API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  11. התקינו את ה-CLI של Google Cloud.

  12. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  13. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  14. מתקינים את Composer, כלי לניהול תלות ב-PHP. צריך להתקין את Composer באופן גלובלי במערכות Linux ו-Mac OS X.
  15. בגלל שינויים בהתנהגות ברירת המחדל של Cloud Build בנוגע לשימוש בחשבונות שירות בפרויקטים חדשים, ושינויים במדיניות הארגון שמוגדרת כמאובטחת כברירת מחדל, יכול להיות שתצטרכו להקצות תפקידים נוספים לחשבון השירות שמשמש לפריסה. מידע נוסף על מתן תפקידים ספציפיים זמין במדריך לפתרון בעיות.

הורדת האפליקציה לדוגמה

  1. אפשר לעיין בקוד ב-GitHub

  2. מורידים או משכפלים את האפליקציה.

    git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git

    אפשר גם להוריד את הדוגמה כקובץ ZIP ולחלץ אותה.

  3. מנווטים לספרייה getting-started.

    cd php-docs-samples/appengine/standard/getting-started

ציון יחסי תלות באמצעות composer.json

האפליקציה משתמשת בבקר קדמי כדי לנתב בקשות. קוד הדוגמה במדריך הזה משתמש ב-Slim Framework, אבל אתם יכולים להשתמש בכל מסגרת אינטרנט שתבחרו.

  1. פותחים את הקובץ composer.json כדי לבדוק את כל התלויות הישירות:

    {
      "require": {
        "google/cloud-storage": "^1.6",
        "slim/slim": "^4.0",
        "slim/psr7": "^1.0",
        "slim/twig-view": "^3.0",
        "php-di/slim-bridge": "^3.1",
        "symfony/yaml": "^5.2"
      },
      "autoload": {
         "psr-4": {
           "Google\\Cloud\\Samples\\AppEngine\\GettingStarted\\": "src"
         }
      }
    }
    
  2. כדי להתקין את התלויות וליצור קובץ composer.lock, מריצים את הפקודה הבאה:

    composer install
    

    קובץ composer.lock עוזר לאפליקציה לאחזר את אותן גרסאות של החבילות שבהן אתם משתמשים בכמה גרסאות build ובסביבות שונות.

הפעלת האפליקציה והגדרת בקרי קצה

קובץ index.php מאתחל את האפליקציה ומעביר את כל הבקשות לבקרים שמוגדרים בקובץ ./src/controllers.php.


// Use the composer autoloader to load dependencies.
require_once __DIR__ . '/vendor/autoload.php';

//  Load the application code.
/** @var Slim\App $app */
$app = require __DIR__ . '/src/app.php';
require __DIR__ . '/src/controllers.php';

// Bootstrap the slim framework to handle the request.
$app->run();

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

שילוב עם שירותי Google Cloud

כדי לאחסן נתונים באפליקציות ב-App Engine, צריך לשלב אותן עם מערכות חיצוניות. האפליקציה לדוגמה מאחסנת נתונים טקסטואליים ב-Cloud SQL ותמונות ב-Cloud Storage.

בדף 'בחירת אפשרות אחסון' מפורטות כל Google Cloud אפשרויות האחסון.

שימוש ב-Cloud SQL

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

כדי להוסיף תוכן למסד הנתונים של האפליקציה, צריך ליצור מכונת מסד נתונים ב-Cloud SQL.

יצירת מכונה של Cloud SQL

משתמשים ב-CLI של gcloud כדי ליצור מופע Cloud SQL:

gcloud sql instances create INSTANCE_NAME --tier=MACHINE_TYPE --region=REGION

לדוגמה, אם רוצים לתת למכונה את השם bookshelf ולהשתמש בסוג המכונה db-n1-standard-2 באזור המרכזי של ארצות הברית:

gcloud sql instances create bookshelf --tier=db-n1-standard-2 --region=us-central1

הגדרת משתמש Root של MySQL

אתם יכולים להשתמש ב-CLI של gcloud כדי להגדיר את הסיסמה של משתמש הבסיס במופע Cloud SQL:

gcloud sql users set-password USER --host=HOST --instance=INSTANCE_NAME --password=PASSWORD

לדוגמה, אם רוצים להגדיר את הסיסמה של משתמש הבסיס למופע Cloud SQL‏ bookshelf ל-passw0rd!:

gcloud sql users set-password root --host=% --instance=bookshelf --password=passw0rd!

הגדרת מסד נתונים במכונה של Cloud SQL

כדי לאחסן את המחברים, השמות, תאריך הפרסום והתיאורים של הספרים, צריך ליצור מסד נתונים של MySQL:

gcloud sql databases create DATABASE_NAME --instance=INSTANCE_NAME

לדוגמה, אם רוצים ליצור מסד נתונים בשם book-data במכונת Cloud SQL‏ bookshelf:

gcloud sql databases create book-data --instance=bookshelf

חיבור למסד נתונים של Cloud SQL

אפליקציית הדוגמה משתמשת ב-PDO של PHP כדי ליצור אינטראקציה עם מסד הנתונים של MySQL.

// Fill the variables below to match your Cloud SQL configuration.
// $dbConn = 'YOUR_CLOUDSQL_CONNECTION_NAME';
// $dbName = 'YOUR_CLOUDSQL_DATABASE_NAME';
// $dbUser = 'YOUR_CLOUDSQL_USER';
// $dbPass = 'YOUR_CLOUDSQL_PASSWORD';
$dsn = "mysql:unix_socket=/cloudsql/{$dbConn};dbname={$dbName}";
$pdo = new PDO($dsn, $dbUser, $dbPass);

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

שאילתה של שורה אחת

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

$statement = $pdo->prepare('SELECT * FROM books WHERE id = :id');
$statement->bindValue('id', $id, PDO::PARAM_INT);
$statement->execute();
$result = $statement->fetch(PDO::FETCH_ASSOC);

שימוש ב-Cloud Storage

אפליקציית הדוגמה משתמשת ב-Cloud Storage כדי לאחסן את התמונות, שהן קבצים בינאריים, שהמשתמשים מעלים.

יצירת קטגוריה של Cloud Storage

ב-Cloud Storage משתמשים בקטגוריות כדי לארגן את הנתונים ולשלוט בגישה אליהם.

משתמשים ב-CLI של gcloud כדי ליצור קטגוריה של Cloud Storage:

gcloud storage buckets create gs://BUCKET_NAME/ --location=BUCKET_REGION

לדוגמה, אם רוצים ליצור קטגוריה בשם picture-storage באזור us-central1:

gcloud storage buckets create gs://picture-storage/ --location=us-central1
  • אם הפעולה בוצעה ללא שגיאות, הפלט ייראה כך:

    Creating gs://BUCKET_NAME/
  • אם הפעולה לא תצליח, יכול להיות שיוצג הפלט הבא:

    ServiceException: 409 Bucket BUCKET_NAME already exists

    אתם צריכים לנסות שוב עם שם קטגוריה אחר.

קישור פרויקט לקטגוריה של Cloud Storage

כדי להשתמש ב-Cloud Storage, צריך לציין את ספריית Cloud Storage.

use Google\Cloud\Storage\StorageClient;

אחסון תמונות

אחרי שיצרתם קטגוריה של Cloud Storage והגדרתם חיבור, אתם יכולים לאחסן תמונות. אפשר להעלות תמונות עם רשימות מוגדרות מראש של בקרת גישה (ACL) כדי לשלוט בגישה לתמונות.

באפליקציה לדוגמה הזו, לתמונות שמועלות תהיה רשימת ה-ACL המוגדרת מראש public-read. אפשר לגשת לכתובת ה-URL הציבורית דרך המאפיין mediaLink של האובייקט ב-Cloud Storage. אפשר להשתמש בכתובת ה-URL הזו בתג תמונה ב-HTML.

// Set your own image file path and content type below to upload an
// image to Cloud Storage.
// $imageStream = fopen('/path/to/your_image.jpg', 'r');
// $imageContentType = 'image/jpg';
$object = $bucket->upload($imageStream, [
    'metadata' => ['contentType' => $imageContentType],
    'predefinedAcl' => 'publicRead',
]);
$imageUrl = $object->info()['mediaLink'];

הוראות לקריאת אובייקט פרטי ב-Cloud Storage מופיעות במאמר הורדת אובייקטים.

מחיקת תמונות

כשמשתמש מוחק ספר מהאפליקציה, הקוד הזה מסיר את התמונה מקטגוריה של Cloud Storage.

$object = $bucket->object($objectName);
$object->delete();

הגדרת האפליקציה

מגדירים את האפליקציות להפעלה ב-App Engine באמצעות קובץ app.yaml, שבו מציינים את זמן הריצה של האפליקציה, משתני הסביבה והגדרות אחרות.

באפליקציה עם דרישות הגדרה מינימליות, קובץ app.yaml יכול להיות שורה אחת:

PHP 8.1

runtime: php81

PHP 7.4

runtime: php74

אפשר להוסיף לקובץ ההגדרות app.yaml עוד אפשרויות הגדרה ומשתני סביבה ספציפיים לאפליקציה.

הוספת משתני סביבה

בקובץ app.yaml מוגדרת הסביבה של האפליקציה. בדוגמה של מדף הספרים שמופיעה במדריך הזה, ההגדרות מוגדרות כמשתני סביבה כדי שהאפליקציה תדע איך להתחבר למופע הנכון של Cloud SQL ולמאגר הנכון של Cloud Storage.

כדי לפרוס את האפליקציה, צריך לערוך את קובץ התצורה app.yaml:

# See https://cloud.google.com/appengine/docs/standard/php/config/appref for a
# complete list of `app.yaml` directives.

runtime: php84

env_variables:
    GOOGLE_STORAGE_BUCKET: ""
    # populate these to use the "mysql" or "postres" backends
    CLOUDSQL_CONNECTION_NAME: ""
    CLOUDSQL_USER: ""
    CLOUDSQL_PASSWORD: ""
    ## Uncomment to give your database a name other than "bookshelf"
    # CLOUDSQL_DATABASE_NAME: ""
  1. מגדירים את המשתנה GOOGLE_STORAGE_BUCKET לפי שם הקטגוריה שלכם ב-Cloud Storage.

  2. מגדירים את המשתנה CLOUDSQL_CONNECTION_NAME לערך app-name:region:instance-name. אפשר לאחזר את הפרטים הנדרשים באמצעות הפקודה gcloud הבאה:

    gcloud sql instances describe INSTANCE

    במופע Cloud SQL מהדור השני, המחרוזת CLOUDSQL_CONNECTION_NAME תהיה בפורמט הבא: your_project_name:your_region:your_instance

  3. אם מסד הנתונים שיצרתם לא נקרא bookshelf, צריך לבטל את ההערה של המשתנה CLOUD_SQL_DATABASE_NAME ולהגדיר אותו. בדוגמה הזו, מסד הנתונים נוצר עם השם book-data.

  4. בודקים את קובץ app.yaml. הוא אמור להיראות בערך כך:

PHP 8.1

runtime: php81

env_variables:
  GOOGLE_STORAGE_BUCKET: picture-storage
  CLOUDSQL_CONNECTION_NAME: sample-application:us-central1:bookshelf
  CLOUDSQL_USER: root
  CLOUDSQL_PASSWORD: passw0rd!
  CLOUDSQL_DATABASE_NAME: book-data

PHP 7.4

runtime: php74

env_variables:
  GOOGLE_STORAGE_BUCKET: picture-storage
  CLOUDSQL_CONNECTION_NAME: sample-application:us-central1:bookshelf
  CLOUDSQL_USER: root
  CLOUDSQL_PASSWORD: passw0rd!
  CLOUDSQL_DATABASE_NAME: book-data

פריסת האפליקציה

  1. כדי לפרוס את האפליקציה, עוברים לספרייה getting-started ומריצים את הפקודה הבאה:

    gcloud app deploy
  2. כשמופיעה בקשה לגישה למיקום, בוחרים מיקום שקרוב למשתמשי האפליקציה. ‫App Engine הוא אזורי, כלומר התשתית שמריצה את האפליקציה שלכם ממוקמת באזור גיאוגרפי ספציפי. לדוגמה, במדריך הזה נעשה שימוש באזור us-central1 כדי לפרוס את משאבי האחסון. כדי להקטין את זמן האחזור ולשפר את הביצועים, כדאי לפרוס את האפליקציה באותו אזור.

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

  3. לצפייה בטופס הבקשה:

    gcloud app browse

סידור וארגון

כדי להפסיק את החיוב על המשאבים שבהם השתמשתם בפרויקט, אתם יכולים למחוק את הפרויקט ב- Google Cloud .

כדי למחוק את הפרויקט, מריצים את הפקודה הבאה:

gcloud projects delete PROJECT_ID

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

gcloud projects list

המאמרים הבאים