برنامج تعليمي: بناء PHP وتطبيق MySQL في Azure App Service

توفر Azure App Service خدمة استضافة ويب قابلة للتطوير بدرجة كبيرة وذاتية التصحيح باستخدام نظام التشغيل Windows. يوضح هذا البرنامج التعليمي كيفية إنشاء تطبيق PHP في Azure وربطه بقاعدة بيانات MySQL. وعند الانتهاء، سيكون لديك تطبيق Laravel يعمل على Azure App Service في Windows.

توفر Azure App Service خدمة استضافة ويب قابلة للتطوير بدرجة كبيرة وذاتية التصحيح باستخدام نظام التشغيل Linux. يوضح هذا البرنامج التعليمي كيفية إنشاء تطبيق PHP في Azure وربطه بقاعدة بيانات MySQL. عند الانتهاء، سيكون لديك تطبيق Laravel يعمل على Azure App Service في Linux.

Screenshot of a PHP app example titled Task List.

في هذا البرنامج التعليمي، تتعلم كيفية:

  • إنشاء قاعدة بيانات MySQL في Azure
  • ربط تطبيق PHP بـ MySQL
  • توزيع التطبيق على Azure
  • تحديث نموذج البيانات وإعادة نشر التطبيق
  • تدفق سجلات التشخيص من Azure
  • إدارة التطبيق في مدخل Microsoft Azure

إذا لم يكن لديك اشتراك Azure، فقم بإنشاء حساب Azure مجاني قبل أن تبدأ.s

المتطلبات الأساسية

لإكمال هذا البرنامج التعليمي:

إعداد MySQL المحلية

يمكنك في هذه الخطوة إنشاء قاعدة بيانات في خادم MySQL المحلي لكي تستخدمها في هذا البرنامج التعليمي.

الاتصال بخادم MySQL المحلي

في نافذة محطة طرفية، اتصل بخادم MySQL المحلي. يمكنك استخدام نافذة المحطة الطرفية تلك لتنفيذ كافة الأوامر الموجودة في هذا البرنامج التعليمي.

mysql -u root -p

وفي حال طُلِبت منك كلمة مرور، فأدخل كلمة المرور للحساب root. وإن كنت لا تذكر كلمة مرور حساب الجذر، فراجع MySQL: كيفية إعادة تعيين كلمة المرور الجذر.

وإذا كان الأمر يعمل بنجاح، فإن خادم MySQL يعمل هو الآخر. إذا لم يكن الأمر كذلك ، فتأكد من بدء تشغيل خادم MySQL المحلي باتباع خطوات ما بعد التثبيت MySQL.

إنشاء قاعدة بيانات محليًا

  1. عند مطالبة mysql، أنشئ قاعدة بيانات.

    CREATE DATABASE sampledb;
    
  2. قم بإنهاء اتصال الخادم بكتابة quit.

    quit
    

إنشاء تطبيق PHP محليًا

يمكنك في هذه الخطوة الحصول على تطبيق عينة Laravel وتكوين اتصال قاعدة بياناته وتشغيله محليًا.

استنساخ العينة

في نافذة المحطة الطرفية، cd إلى دليل عمل.

  1. استنساخ مستودع عينة وتغيير إلى جذر المستودع.

    git clone https://github.com/Azure-Samples/laravel-tasks
    cd laravel-tasks
    
  2. تأكد من أن الفرع الافتراضي هو main.

    git branch -m main
    

    تلميح

    لا تتطلب App Service تغيير اسم الفرع. ولكن ، نظرا لأن العديد من المستودعات تقوم بتغيير فرعها الافتراضي إلى main، يوضح لك هذا البرنامج التعليمي أيضا كيفية نشر مستودع من main. للحصول على مزيدٍ من المعلومات، راجع تغيير فرع التوزيع.

  3. قم بتثبيت الحزم المطلوبة.

    composer install
    

تكوين اتصال MySQL

في جذر المستودع، أنشئ ملفًا باسم ‎.env. انسخ المتغيرات التالية في ملف ‎.env. استبدل <العنصر النائب root_password> بكلمة مرور المستخدم الجذر MySQL.

APP_ENV=local
APP_DEBUG=true
APP_KEY=

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=sampledb
DB_USERNAME=root
DB_PASSWORD=<root_password>

للحصول على معلومات حول كيفية استخدام Laravel لملف ‎.env، راجع Laravel Environment Configuration.

إنشاء العينة محليًا

  1. ابدأ تشغيل عمليات ترحيل قاعدة بيانات Laravel لإنشاء الجداول التي يحتاجها التطبيق. وللاطلاع على الجداول التي يتم إنشاؤها في عمليات الترحيل، ابحث في دليل قاعدة البيانات/عمليات الترحيل في مستودع Git.

    php artisan migrate
    
  2. أنشئ مفتاح تطبيق Laravel جديدًا.

    php artisan key:generate
    
  3. شغّل التطبيق.

    php artisan serve
    
  4. انتقل إلى http://localhost:8000 في المستعرض. أضف بعض المهام في الصفحة.

    PHP connects successfully to MySQL

  5. لإيقاف PHP ، أدخل Ctrl + C في المحطة.

إنشاء MySQL في Azure

يمكنك في هذه الخطوة إنشاء قاعدة بيانات MySQL في قاعدة بيانات Azure لخادم MySQL. في وقت لاحق، يمكنك إعداد تطبيق PHP للاتصال بقاعدة البيانات هذه.

قم بإنشاء مجموعة موارد

مجموعة الموارد هي حاوية منطقية يتم فيها نشر موارد Azure وإدارتها، مثل تطبيقات الويب وقواعد البيانات وحسابات التخزين. على سبيل المثال، يمكنك اختيار حذف مجموعة الموارد بأكملها في خطوة واحدة بسيطة لاحقاً.

في Cloud Shell، أنشئ مجموعة موارد باستخدام الأمر ⁧⁩⁧az group create⁩⁧⁩. ينشئ المثال التالي مجموعة موارد باسم ⁧⁩myResourceGroup⁧⁩ في موقع ⁧⁩West Europe⁧⁩. لرؤية جميع المواقع المدعومة لخدمة التطبيقات في المستوى المجاني، قم بتشغيل az appservice list-locations --sku FREE الأمر.

az group create --name myResourceGroup --location "West Europe"

يمكنك بشكل عامّ إنشاء مجموعة موارد خاصة بك، والموارد في منطقة قريبة منك.

عند انتهاء الأمر، يظهر لك إخراج JSON خصائص مجموعة الموارد.

إنشاء خادم MySQL

في Cloud Shell، أنشئ خادمًا في قاعدة بيانات Azure لخادم MySQL باستخدام الأمر az mysql server create.

في الأمر التالي، استبدل اسم خادم فريد بالعنصر النائب لاسم خادم mysql، واسم> مستخدم للمسؤول-المستخدم، وكلمة مرور للعنصر النائب لكلمة<<مرور> المسؤول.<> ويجري استخدام اسم الخادم كجزء من نقطة نهاية MySQL (https://<mysql-server-name>.mysql.database.azure.com)، لذلك يجب أن يكون الاسم فريدًا بكافة الخوادم في Azure. وللحصول على تفاصيل حول تحديد MySQL DB SKU، راجع إنشاء قاعدة بيانات Azure لخادم MySQL.

az mysql server create --resource-group myResourceGroup --name <mysql-server-name> --location "West Europe" --admin-user <admin-user> --admin-password <admin-password> --sku-name B_Gen5_1

عند إنشاء خادم MySQL، يعرض Azure CLI معلومات مماثلة للمثال التالي:

{
  "administratorLogin": "<admin-user>",
  "administratorLoginPassword": null,
  "fullyQualifiedDomainName": "<mysql-server-name>.mysql.database.azure.com",
  "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.DBforMySQL/servers/<mysql-server-name>",
  "location": "westeurope",
  "name": "<mysql-server-name>",
  "resourceGroup": "myResourceGroup",
  ...
  -  < Output has been truncated for readability >
}

تكوين جدار حماية الخادم

  1. في Cloud Shell، أنشئ قاعدة جدار حماية لخادم MySQL لإتاحة اتصالات العميل باستخدام الأمر az mysql server firewall-rule create. عند تعيين كل من IP بدء تشغيل وIP النهاية إلى 0.0.0.0، يتم فتح جدار الحماية فقط لموارد Azure الأخرى.

    az mysql server firewall-rule create --name allAzureIPs --server <mysql-server-name> --resource-group myResourceGroup --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0
    

    تلميح

    ويمكن أن تكون أكثر تقييدًا في قاعدة جدار الحماية باستخدام عناوين IP الصادرة فقط التي يستخدمها التطبيق.

  2. في Cloud Shell، قم بتشغيل الأمر مرة أخرى للسماح بالوصول من الكمبيوتر المحلي عن طريق استبدال <عنوان> IP الخاص بك بعنوان IP IP المحلي الخاص بك.

    az mysql server firewall-rule create --name AllowLocalClient --server <mysql-server-name> --resource-group myResourceGroup --start-ip-address=<your-ip-address> --end-ip-address=<your-ip-address>
    

إنشاء قاعدة بيانات إنتاج

  1. في نافذة المحطة الطرفية المحلية، اتصل بخادم MySQL في Azure. استخدم القيمة التي حددتها مسبقا للمسؤول-المستخدم<>واسم<> خادم mysql. عند مطالبتك بإدخال كلمة مرور، استخدم كلمة المرور التي حددتها عند إنشاء قاعدة البيانات في Azure.

    mysql -u <admin-user>@<mysql-server-name> -h <mysql-server-name>.mysql.database.azure.com -P 3306 -p
    
  2. عند مطالبة mysql، أنشئ قاعدة بيانات.

    CREATE DATABASE sampledb;
    
  3. أنشئ مستخدم قاعدة بيانات يحمل اسم phpappuser وامنحه كافة الامتيازات في قاعدة بيانات sampledb. ولأغراض تبسيط البرنامج التعليمي، استخدم MySQLAzure2017 ككلمة مرور.

    CREATE USER 'phpappuser' IDENTIFIED BY 'MySQLAzure2017'; 
    GRANT ALL PRIVILEGES ON sampledb.* TO 'phpappuser';
    
  4. قم بإنهاء اتصال الخادم عن طريق إدخال quit.

    quit
    

توصيل التطبيق بخادم Azure MySQL

يمكنك في هذه الخطوة توصيل تطبيق PHP بقاعدة بيانات MySQL التي أنشأتها في قاعدة بيانات Azure لخادم MySQL.

تكوين اتصال قاعدة البيانات

في جذر المستودع، أنشئ ملف ‎.env.production وانسخ المتغيرات التالية إليه. استبدال placeholder_<mysql-server-name>_ في كل من DB_HOSTو DB_USERNAME.

APP_ENV=production
APP_DEBUG=true
APP_KEY=

DB_CONNECTION=mysql
DB_HOST=<mysql-server-name>.mysql.database.azure.com
DB_DATABASE=sampledb
DB_USERNAME=phpappuser@<mysql-server-name>
DB_PASSWORD=MySQLAzure2017
MYSQL_SSL=true

حفظ التغييرات.

تلميح

لتأمين معلومات اتصال MySQL، يتم استبعاد هذا الملف بالفعل من مستودع Git (راجع ‎.gitignore في جذر المستودع). في وقت لاحق، تتعلم كيفية إعداد متغيرات البيئة في App Service للاتصال بقاعدة البيانات الخاصة بك في قاعدة بيانات Azure ل MySQL. وباستخدام متغيرات البيئة، لا تحتاج إلى ملف .env في App Service.

تكوين شهادة TLS/SSL

تفرض قاعدة بيانات Azure لخادم MySQL اتصالات TLS من العملاء بشكل افتراضي. وللاتصال بقاعدة بيانات MySQL في Azure، يجب عليك استخدام الشهادة .pem التي توفرها قاعدة بيانات Azure لخادم MySQL.

افتح config/database.php وأضف sslmode ومعلمات options إلى connections.mysql، على النحو الموضح في التعليمات البرمجية التالية.

'mysql' => [
    ...
    'sslmode' => env('DB_SSLMODE', 'prefer'),
    'options' => (env('MYSQL_SSL')) ? [
        PDO::MYSQL_ATTR_SSL_KEY    => '/ssl/BaltimoreCyberTrustRoot.crt.pem', 
    ] : []
],
'mysql' => [
    ...
    'sslmode' => env('DB_SSLMODE', 'prefer'),
    'options' => (env('MYSQL_SSL') && extension_loaded('pdo_mysql')) ? [
        PDO::MYSQL_ATTR_SSL_KEY    => '/ssl/BaltimoreCyberTrustRoot.crt.pem',
    ] : []
],

يتم توفير شهادة BaltimoreCyberTrustRoot.crt.pem في مستودع لأغراض التسهيل في هذا البرنامج التعليمي.

اختبر التطبيق محليًا

  1. ابدأ تشغيل عمليات ترحيل قاعدة بيانات Laravel باستخدام ‎.env.production كملف البيئة لإنشاء الجداول في قاعدة بيانات MySQL الموجودة في قاعدة بيانات Azure لخادم MySQL. وتذكر أن ‎.env.production يمتلك معلومات الاتصال بقاعدة بيانات MySQL في Azure.

    php artisan migrate --env=production --force
    
  2. ولا يملك ‎.env.production مفتاح تطبيق صالحًا حتى الآن. فأنشئ مفتاحًا جديدًا لهذا الغرض في المحطة الطرفية.

    php artisan key:generate --env=production --force
    
  3. ابدأ تشغيل تطبيق العينة باستخدام ‎.env.production كملف البيئة.

    php artisan serve --env=production
    
  4. انتقل إلى http://localhost:8000. في حال تحميل الصفحة دون وجود أخطاء، فإن تطبيق PHP يتصل بقاعدة بيانات MySQL في Azure.

  5. أضف بعض المهام في الصفحة.

    PHP connects successfully to Azure Database for MySQL

  6. لإيقاف PHP ، أدخل Ctrl + C في المحطة.

تثبيت التغييرات التي قمت بها

ابدأ تشغيل أوامر Git التالية لتنفيذ التغييرات التي أجريتها:

git add .
git commit -m "database.php updates"

التطبيق جاهز للنشر.

نشر في Azure

يمكنك في هذه الخطوة توزيع تطبيق PHP المتصل بخادم MySQL لخدمة Azure App Service.

تكوين مستخدم توزيع

يمكن لـ FTP وGit النشر على تطبيق موقع Azure باستخدام مستخدم نشر. بمجرد تكوين مستخدم النشر الخاص بك، يمكنك استخدامه لكافة عمليات نشر Azure الخاصة بك. يختلف اسم مستخدم وكلمة مرور التوزيع على مستوى الحساب عن بيانات اعتماد اشتراك Azure الخاصة بك.

لتكوين مستخدم التوزيع، قم بتشغيل مجموعة مستخدم توزيع az webapp باستخدام الأمر في Azure Cloud Shell. استبدل <اسم المستخدم> وكلمة المرور باسم مستخدم نشر وكلمة <> مرور.

  • يجب أن يكون اسم المستخدم فريدًا في Azure، ولا يجب أن يحتوي دفع Git المحلي على رمز ’@‘.
  • يجب أن يكون طول كلمة المرور ثمانية أحرف على الأقل، مع اثنين من العناصر الثلاثة التالية: الأحرف والأرقام والرموز.
az webapp deployment user set --user-name <username> --password <password>

يظهر إخراج JSON كلمة المرور كـ null. إذا واجهت خطأ، قم بتغيير 'Conflict'. Details: 409 اسم المستخدم. إذا واجهت خطأ 'Bad Request'. Details: 400 استخدم كلمة مرور أقوى.

سجل اسم المستخدم وكلمة المرور لاستخدامها لنشر تطبيقات الويب الخاصة بك.

إنشاء خطة App Service

في Cloud Shell، أنشئ خطة خدمة التطبيق باستخدام الأمر az appservice plan create.

ينشئ المثال التالي خطة App ServicemyAppServicePlan المسماة في طبقة التسعيرالمجاني:

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE

عند إنشاء خطة App Service، يعرض Azure CLI معلومات مشابهة للمثال التالي:

{ 
  "adminSiteName": null,
  "appServicePlanName": "myAppServicePlan",
  "geoRegion": "West Europe",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "app",
  "location": "West Europe",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
} 

في Cloud Shell، أنشئ خطة خدمة التطبيق باستخدام الأمر az appservice plan create.

ينشئ المثال التالي خطة App ServicemyAppServicePlan المسماة في طبقة التسعيرالمجاني:

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE --is-linux

عند إنشاء خطة خدمة التطبيق، يعرض Azure CLI معلومات مشابهة للمثال التالي:

{ 
  "freeOfferExpirationTime": null,
  "geoRegion": "West Europe",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "linux",
  "location": "West Europe",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
} 

أنشئ تطبيق ويب

إنشاء تطبيق ويب في myAppServicePlan خطة App Service.

في Cloud Shell، يمكنك استخدام az webapp create الأمر. في المثال التالي، استبدل <app-name> باسم تطبيق فريد عالمي (الأحرف الصالحة هي a-z و0-9-). تم تحديد وقت التشغيل إلى PHP|7.2. لمعرفة جميع أوقات التشغيل المعتمدة، قم بتشغيل az webapp list-runtimes --os linux.

# Bash
az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|7.2" --deployment-local-git
# PowerShell
az --% webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|7.2" --deployment-local-git

عند إنشاء تطبيق ويب، يعرض Azure CLI الإخراج مشابهًا للمثال التالي:

Local git is configured with url of 'https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<app-name>.azurewebsites.net",
  "deploymentLocalGitUrl": "https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

لقد أنشأت تطبيق ويب جديدًا فارغًا، مع تمكين نشر git.

ملاحظة

يظهر عنوان URL الخاص ببرنامج Git عن بُعد في deploymentLocalGitUrl الخاصية، مع التنسيق https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git. احفظ عنوان URL هذا حيث تحتاج إليه لاحقًا.

إنشاء تطبيق ويب في myAppServicePlan خطة App Service.

في Cloud Shell، يمكنك استخدام az webapp create الأمر. في المثال التالي، استبدل <app-name> باسم تطبيق فريد عالمي (الأحرف الصالحة هي a-z و0-9-). تم تحديد وقت التشغيل إلى PHP|7.2. لمعرفة جميع أوقات التشغيل المعتمدة، قم بتشغيل az webapp list-runtimes --os linux.

# Bash
az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|7.2" --deployment-local-git
# PowerShell
az --% webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime "PHP|7.2" --deployment-local-git

عند إنشاء تطبيق ويب، يعرض Azure CLI الإخراج مشابهًا للمثال التالي:

Local git is configured with url of 'https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<app-name>.azurewebsites.net",
  "deploymentLocalGitUrl": "https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

لقد أنشأت تطبيق ويب جديدًا فارغًا، مع تمكين نشر git.

ملاحظة

يظهر عنوان URL الخاص ببرنامج Git عن بُعد في deploymentLocalGitUrl الخاصية، مع التنسيق https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git. احفظ عنوان URL هذا حيث تحتاج إليه لاحقًا.

تكوين إعدادات قاعدة البيانات

في App Service، يمكنك تعيين متغيرات البيئة كإعدادات تطبيق باستخدام الأمر az webapp config appsettings set.

يقوم الأمر التالي بتكوين إعدادات التطبيق DB_HOST وDB_DATABASE وDB_USERNAME وDB_PASSWORD. استبدل اسم تطبيق العناصر النائبة< واسم><خادم> mysql.

az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DB_HOST="<mysql-server-name>.mysql.database.azure.com" DB_DATABASE="sampledb" DB_USERNAME="phpappuser@<mysql-server-name>" DB_PASSWORD="MySQLAzure2017" MYSQL_SSL="true"

يمكنك استخدام أسلوب PHP getenv للوصول إلى الإعدادات. وتستخدم التعليمات البرمجية لتطبيق Laravel أداة الالتفاف env على PHP getenv. فعلى سبيل المثال، يصبح تكوين MySQL في config/database.php في شكل التعليمات البرمجية التالية:

'mysql' => [
    'driver'    => 'mysql',
    'host'      => env('DB_HOST', 'localhost'),
    'database'  => env('DB_DATABASE', 'forge'),
    'username'  => env('DB_USERNAME', 'forge'),
    'password'  => env('DB_PASSWORD', ''),
    ...
],

تكوين متغيرات بيئة Laravel

يحتاج Laravel إلى مفتاح تطبيق في App Service. حيث يمكنك تكوينه باستخدام إعدادات التطبيق.

  1. وفي نافذة المحطة الطرفية المحلية، استخدم php artisan لإنشاء مفتاح تطبيق جديد دون حفظه إلى .env.

    php artisan key:generate --show
    
  2. في Cloud Shell، يلزم تعيين مفتاح التطبيق في تطبيق App Service باستخدام الأمر az webapp config appsettings set. استبدل اسم> تطبيق العناصر النائبة< و <outputofphpartisankey:generate>.

    az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings APP_KEY="<output_of_php_artisan_key:generate>" APP_DEBUG="true"
    

    تخبر APP_DEBUG="true" Laravel بإرجاع معلومات تصحيح الأخطاء عندما يواجه التطبيق الموزع أخطاء. وعند تشغيل تطبيق إنتاج، قم بتعيينه إلى false، حيث إنه أكثر أمانًا.

تعيين مسار التطبيق الظاهري

قم بتعيين مسار التطبيق الظاهري للتطبيق. ويلزم اتخاذ تلك الخطوة لأن دورة حياة تطبيق Laravel تبدأ في الدليل العام بدلاً من الدليل الجذر الخاص بالتطبيق. ويمكن أن تعمل أطر عمل PHP الأخرى التي تبدأ دورة حياتها في الدليل الجذر دون وجود تكوين يدوي لمسار التطبيق الظاهري.

في Cloud Shell، يلزم تعيين مسار التطبيق الظاهري باستخدام الأمر az resource update. استبدل <العنصر النائب لاسم> التطبيق.

az resource update --name web --resource-group myResourceGroup --namespace Microsoft.Web --resource-type config --parent sites/<app_name> --set properties.virtualApplications[0].physicalPath="site\wwwroot\public" --api-version 2015-06-01

افتراضيًا، يوجه Azure App Service مسار التطبيق الظاهري للجذر ( / ) نحو الدليل الجذر الخاص بملفات التطبيقات الموزعة (sites\wwwroot).

تبدأ دورة حياة تطبيق Laravel في الدليل العام بدلاً من الدليل الجذر الخاص بالتطبيق. تستخدم صورة PHP Docker الافتراضية في App Service ملف Apache، ولا تتيح لك تخصيص DocumentRoot لتطبيق Laravel. ولكن يمكنك استخدامها .htaccess لإعادة كتابة جميع الطلبات للإشارة إلى /public بدلا من الدليل الجذر. في جذر المستودع، يُضاف .htaccess بالفعل لهذا الغرض. ورغم ذلك، يكون تطبيق Laravel جاهزًا للتوزيع.

للحصول على مزيدٍ من المعلومات، راجع تغيير جذر الموقع.

ادفع إلى Azure من Git

  1. نظرًا لأنك تقوم بنشر⁧main⁩ الفرع، فأنت بحاجة إلى تعيين فرع النشر الافتراضي لتطبيقي App Service⁧main⁩(انظر ⁧⁩تغيير فرع النشر⁧⁩). في Cloud Shell، اضبطDEPLOYMENT_BRANCH إعداد التطبيق باستخدامaz webapp config appsettings setالأمر.

    az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DEPLOYMENT_BRANCH='main'
    
  2. بالرجوع إلى نافذة المحطة الطرفية المحلية، أضف جهاز تحكم عن بعد لـ Azure إلى مستودع Git المحلي. استبدل <النشرLocalGitUrl-from-create-step> بعنوان URL الخاص بجهاز التحكم عن بعد Git الذي قمت بحفظه من إنشاء تطبيق ويب.

    git remote add azure <deploymentLocalGitUrl-from-create-step>
    
  3. اضغط على جهاز التحكم عن بعد لـ Azure لتوزيع التطبيق الخاص بك مع الأمر التالي. عندما تطالبك "Git Credential Manager" ببيانات الاعتماد، تأكد من إدخال بيانات الاعتماد التي قمت بإنشائها في تكوين مستخدم نشر، وليس بيانات الاعتماد التي تستخدمها لتسجيل الدخول إلى مدخل Azure.

    git push azure main
    

    ربما يستغرق الأمر بضع دقائق للتشغيل. أثناء التشغيل، يعرض معلومات مُشابهة للمثال التالي:

   Counting objects: 3, done.
   Delta compression using up to 8 threads.
   Compressing objects: 100% (3/3), done.
   Writing objects: 100% (3/3), 291 bytes | 0 bytes/s, done.
   Total 3 (delta 2), reused 0 (delta 0)
   remote: Updating branch 'main'.
   remote: Updating submodules.
   remote: Preparing deployment for commit id 'a5e076db9c'.
   remote: Running custom deployment command...
   remote: Running deployment command...
   ...
   < Output has been truncated for readability >
   

ملاحظة

قد تلاحظ أن عملية التوزيع تقوم بتثبيت حزم Composer في النهاية. ولا تقوم App Service بتشغيل العمليات التلقائية في أثناء التوزيع الافتراضي، لذا يحتوي مستودع العينة على ثلاثة ملفات إضافية في الدليل الجذر لتمكينه:

  • .deployment - يأمر هذا الملف App Service بتشغيل bash deploy.sh باعتباره البرنامج النصي للتوزيع المخصص.
  • deploy.sh - البرنامج النصي للتوزيع المخصص. إذا راجعت الملف، سترى أنه يعمل على تشغيل php composer.phar install بعد npm install.
  • composer.phar - مدير حزم Composer.

يمكنك اتباع هذا النهج لإضافة أي خطوة بالتوزيع المستند إلى Git في App Service. للحصول على مزيدٍ من المعلومات، راجع البرنامج النصي للتوزيع المخصص.

  1. نظرًا لأنك تقوم بنشر⁧main⁩ الفرع، فأنت بحاجة إلى تعيين فرع النشر الافتراضي لتطبيقي App Service⁧main⁩(انظر ⁧⁩تغيير فرع النشر⁧⁩). في Cloud Shell، اضبطDEPLOYMENT_BRANCH إعداد التطبيق باستخدامaz webapp config appsettings setالأمر.

    az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DEPLOYMENT_BRANCH='main'
    
  2. بالرجوع إلى نافذة المحطة الطرفية المحلية، أضف جهاز تحكم عن بعد لـ Azure إلى مستودع Git المحلي. استبدل <النشرLocalGitUrl-from-create-step> بعنوان URL الخاص بجهاز التحكم عن بعد Git الذي قمت بحفظه من إنشاء تطبيق ويب.

    git remote add azure <deploymentLocalGitUrl-from-create-step>
    
  3. اضغط على جهاز التحكم عن بعد لـ Azure لتوزيع التطبيق الخاص بك مع الأمر التالي. عندما تطالبك "Git Credential Manager" ببيانات الاعتماد، تأكد من إدخال بيانات الاعتماد التي قمت بإنشائها في تكوين مستخدم نشر، وليس بيانات الاعتماد التي تستخدمها لتسجيل الدخول إلى مدخل Azure.

    git push azure main
    

    ربما يستغرق الأمر بضع دقائق للتشغيل. أثناء التشغيل، يعرض معلومات مُشابهة للمثال التالي:

   Counting objects: 3, done.
   Delta compression using up to 8 threads.
   Compressing objects: 100% (3/3), done.
   Writing objects: 100% (3/3), 291 bytes | 0 bytes/s, done.
   Total 3 (delta 2), reused 0 (delta 0)
   remote: Updating branch 'main'.
   remote: Updating submodules.
   remote: Preparing deployment for commit id 'a5e076db9c'.
   remote: Running custom deployment command...
   remote: Running deployment command...
   ...
   < Output has been truncated for readability >
   

استعراض الوصول إلى تطبيق Azure

استعرض وصولاً إلى http://<app-name>.azurewebsites.net، وأضف بعض المهام إلى القائمة.

Screenshot of the Azure app example titled Task List showing new tasks added.

تهانينا، لقد بدأت تشغيل تطبيق PHP يستند إلى البيانات في Azure App Service.

تحديث النموذج محليًا وإعادة التوزيع

يمكنك في هذه الخطوة إجراء تغيير بسيط على نموذج بيانات ⁧task⁩ وتطبيق الويب، ثم نشر التحديث إلى Azure.

بالنسبة لسيناريو المهام، يمكنك تغيير التطبيق بحيث يمكنك وضع علامة على مهمة على أنها مكتملة.

إضافة عمود

  1. في نافذة المحطة الطرفية المحلية، انتقل إلى جذر مستودع Git.

  2. أنشئ ترحيل قاعدة بيانات جديدة لجدول tasks:

    php artisan make:migration add_complete_column --table=tasks
    
  3. يوضح لك هذا الأمر اسم ملف الترحيل الذي جرى إنشاؤه. ابحث عن هذا الملف في database/migrations وافتحه.

  4. استبدل الأسلوب up بالتعليمات البرمجية التالية:

    public function up()
    {
        Schema::table('tasks', function (Blueprint $table) {
            $table->boolean('complete')->default(False);
        });
    }
    

    تضيف التعليمات البرمجية السابقة عمودًا منطقيًا في جدول tasks والذي يُسمى complete.

  5. استبدل أسلوب down بالتعليمات البرمجية التالية لإجراء العودة إلى الحالة السابقة:

    public function down()
    {
        Schema::table('tasks', function (Blueprint $table) {
            $table->dropColumn('complete');
        });
    }
    
  6. في نافذة المحطة الطرفية المحلية، ابدأ تشغيل عمليات ترحيل قاعدة بيانات Laravel لإجراء التغيير في قاعدة البيانات المحلية.

    php artisan migrate
    

    استنادًا إلى اصطلاح تسمية Laravel، يتم تعيين النموذج Task (راجع app/Task.php) للجدول tasks بشكل افتراضي.

تحديث منطق التطبيق

  1. افتح ملف routes/web.php. ويحدد التطبيق مساراته ومنطق العمل هنا.

  2. وفي نهاية الملف، أضف مسارًا إلى جانب التعليمات البرمجية التالية:

    /**
     * Toggle Task completeness
     */
    Route::post('/task/{id}', function ($id) {
        error_log('INFO: post /task/'.$id);
        $task = Task::findOrFail($id);
    
        $task->complete = !$task->complete;
        $task->save();
    
        return redirect('/');
    });
    

    تُجري التعليمات البرمجية السابقة تحديثًا بسيطًا إلى نموذج البيانات عن طريق تبديل قيمة complete.

تحديث طريقة العرض

  1. افتح ملف resources/views/tasks.blade.php. ابحث عن علامة بداية <tr>، واستبدلها بما يلي:

    <tr class="{{ $task->complete ? 'success' : 'active' }}" >
    

    تقوم التعليمات البرمجية السابقة بتغيير لون الصف استنادًا إلى ما إذا كانت المهمة مكتملة من عدمه.

  2. وفي السطر التالي، تكون لديك التعليمات البرمجية التالية:

    <td class="table-text"><div>{{ $task->name }}</div></td>
    

    استبدل السطر بأكمله بالتعليمات البرمجية التالية:

    <td>
        <form action="{{ url('task/'.$task->id) }}" method="POST">
            {{ csrf_field() }}
    
            <button type="submit" class="btn btn-xs">
                <i class="fa {{$task->complete ? 'fa-check-square-o' : 'fa-square-o'}}"></i>
            </button>
            {{ $task->name }}
        </form>
    </td>
    

    تضيف التعليمات البرمجية السابقة الزر "إرسال" الذي يشير إلى المسار الذي حددته في وقت سابق.

اختبار التغييرات محليًا

  1. في نافذة المحطة الطرفية المحلية، ابدأ تشغيل خادم التطوير من الدليل الجذر الخاص بمستودع Git.

    php artisan serve
    
  2. لرؤية تغيير حالة المهمة، انتقل إلى http://localhost:8000 خانة الاختيار وحددها.

    Added check box to task

  3. لإيقاف PHP ، أدخل Ctrl + C في المحطة.

نشر التغييرات على Azure

  1. في نافذة المحطة الطرفية المحلية، ابدأ تشغيل عمليات ترحيل قاعدة بيانات Laravel باستخدام سلسلة اتصال الإنتاج لإجراء التغيير في قاعدة بيانات Azure.

    php artisan migrate --env=production --force
    
  2. قم بتنفيذ كافة التغييرات في Git، ثم انقل تغييرات التعليمات البرمجية إلى Azure.

    git add .
    git commit -m "added complete checkbox"
    git push azure main
    
  3. بمجرد اكتمال العملية git push ، انتقل إلى تطبيق Azure واختبر الوظيفة الجديدة.

    Model and database changes published to Azure

إذا قمت بإضافة أي مهمة، الاحتفاظ بها في قاعدة البيانات. تترك تحديثات مخطط البيانات تلك البيانات الموجودة على حالها.

دفق سجلات التشخيص

في أثناء عمل تطبيق PHP في Azure App Service، يمكنك توصيل تمرير وحدة التحكم إلى المحطة الطرفية. وبهذه الطريقة، يمكنك الحصول على الرسائل التشخيصية ذاتها لمساعدتك في تتبع أخطاء التطبيق.

لبدء دفق السجل، استخدم الأمر az webapp log tail الموجود في Cloud Shell.

az webapp log tail --name <app_name> --resource-group myResourceGroup

وبمجرد بدء دفق السجل، ابدأ تحديث تطبيق Azure في المستعرض للحصول على بعض نسب استخدام شبكة الويب. ويمكنك الآن رؤية سجلات وحدة التحكم التي تم تمريرها إلى المحطة الطرفية. وفي حال عدم رؤية سجلات وحدة التحكم على الفور، فتحقق مجددًا في غضون 30 ثانية.

لإيقاف تدفق السجل في أي وقت، أدخل Ctrl+C.

للوصول إلى سجلات وحدة التحكم التي تم إنشاؤها من داخل التعليمة البرمجية للتطبيق في خدمة التطبيقات، قم بتشغيل تسجيل التشخيص عن طريق تشغيل الأمر التالي في Cloud Shell:

az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --level Verbose

القيم المحتملة لـ --level هي: Error وWarning وInfo وVerbose. يتضمن كل مستوى لاحق المستوى السابق. على سبيل المثال: Error يتضمن رسائل الخطأ فقط بينما Verbose يتضمن جميع الرسائل.

بمجرد تشغيل التسجيل التشخيصي، قم بتشغيل الأمر التالي لمشاهدة تدفق السجل:

az webapp log tail --resource-group <resource-group-name> --name <app-name>

إذا كنت لا ترى سجلات وحدة التحكم على الفور، فتحقق مرة أخرى في غضون 30 ثانية.

ملاحظة

يمكنك أيضًا فحص ملفات السجل من المتصفح الموجود على https://<app-name>.scm.azurewebsites.net/api/logs/docker.

لإيقاف تسجيل التدفق في أي وقت، اكتب Ctrl+C.

تلميح

يمكن لتطبيق PHP استخدام error_log() لإخراج وحدة التحكم. ويستخدم تطبيق العينة هذا النهج في app/Http/routes.php.

وفي إطار عمل ويب، يستخدم Laravel Monolog كموفر تسجيل. لمعرفة كيفية الحصول على Monolog لإخراج الرسائل إلى وحدة التحكم، راجع PHP: كيفية استخدام monolog لتسجيل وحدة التحكم (php://out).

إدارة تطبيق Azure

  1. انتقل إلى مدخل Microsoft Azure لإدارة التطبيق الذي أنشأته.

  2. من القائمة اليمنى، حدد خدمات التطبيق، ثم حدد اسم تطبيق Azure.

    Portal navigation to Azure app

    يمكنك مشاهدة صفحة "Overview" على التطبيق. في هذه الصفحة، يمكنك القيام بمهام الإدارة الأساسية مثل الإيقاف والبدء وإعادة التشغيل والتصفح والحذف.

    توفر القائمة اليمنى صفحات لتكوين التطبيق.

    App Service page in Azure portal

تنظيف الموارد

في الخطوات السابقة، أنشأت موارد Azure في مجموعة الموارد. إذا لم تتوقع احتياجك لهذه الموارد في المستقبل، فاحذف مجموعة الموارد من خلال تشغيل الأمر التالي في Cloud Shell:

az group delete --name myResourceGroup

ربما يستغرق الأمر بضع دقائق للتشغيل.

الخطوات التالية

تعلمت في هذا البرنامج التعليمي كيفية:

  • إنشاء قاعدة بيانات MySQL في Azure
  • ربط تطبيق PHP بـ MySQL
  • توزيع التطبيق على Azure
  • تحديث نموذج البيانات وإعادة نشر التطبيق
  • تدفق سجلات التشخيص من Azure
  • إدارة التطبيق في مدخل Azure

انتقل إلى البرنامج التعليمي التالي لمعرفة كيفية تعيين اسم DNS مخصص إلى التطبيق.

أو، يمكنك التحقق من الموارد الأخرى: