برنامج تعليمي: بناء 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.
في هذا البرنامج التعليمي، تتعلم كيفية:
- إنشاء قاعدة بيانات MySQL في Azure
- ربط تطبيق PHP بـ MySQL
- توزيع التطبيق على Azure
- تحديث نموذج البيانات وإعادة نشر التطبيق
- تدفق سجلات التشخيص من Azure
- إدارة التطبيق في مدخل Microsoft Azure
إذا لم يكن لديك اشتراك Azure، فقم بإنشاء حساب Azure مجاني قبل أن تبدأ.s
المتطلبات الأساسية
لإكمال هذا البرنامج التعليمي:
- تثبيت Git
- تثبيت PHP 5.6.4 أو إصدار أعلى
- تثبيت Composer
- تمكين ملحقات PHP التي يحتاجها Laravel مثل: OpenSSL وPDO-MySQL وMbstring وTokenizer وXML
- تثبيت MySQL وبدء تشغيلها
استخدم بيئة Bash في Azure Cloud Shell. لمزيد من المعلومات، راجع تشغيل سريع لـ Azure Cloud Shell - Bash.
إذا كنت تفضل تشغيل أوامر مرجع CLI محلياً قم بتثبيت CLI Azure. إذا كنت تعمل على Windows أو macOS، ففكر في تشغيل Azure CLI في حاوية Docker. لمزيد من المعلومات، راجع كيفية تشغيل Azure CLI في حاوية Docker.
إذا كنت تستخدم تثبيت محلي، يُرجى تسجيل الدخول إلى Azure CLI مستخدمًا أمر az login. لإنهاء عملية المصادقة، التزم بالخطوات المعروضة في وحدتك الطرفية. للحصول على خيارات إضافية لتسجيل دخول، راجع تسجيل الدخول باستخدام Azure CLI.
عند مطالبتك، يوصى بتثبيت امتدادات Azure CLI عند الاستخدام الأول. لمزيد من المعلومات بشأن الامتدادات، راجع استخدام امتدادات مع Azure CLI.
يُرجى تشغيل إصدار az للوصول إلى الإصدار والمكتبات التابعة التي تم تثبيتها. للتحديث لآخر إصدار، يُرجى تشغيل تحديث az.
إعداد MySQL المحلية
يمكنك في هذه الخطوة إنشاء قاعدة بيانات في خادم MySQL المحلي لكي تستخدمها في هذا البرنامج التعليمي.
الاتصال بخادم MySQL المحلي
في نافذة محطة طرفية، اتصل بخادم MySQL المحلي. يمكنك استخدام نافذة المحطة الطرفية تلك لتنفيذ كافة الأوامر الموجودة في هذا البرنامج التعليمي.
mysql -u root -p
وفي حال طُلِبت منك كلمة مرور، فأدخل كلمة المرور للحساب root. وإن كنت لا تذكر كلمة مرور حساب الجذر، فراجع MySQL: كيفية إعادة تعيين كلمة المرور الجذر.
وإذا كان الأمر يعمل بنجاح، فإن خادم MySQL يعمل هو الآخر. إذا لم يكن الأمر كذلك ، فتأكد من بدء تشغيل خادم MySQL المحلي باتباع خطوات ما بعد التثبيت MySQL.
إنشاء قاعدة بيانات محليًا
عند مطالبة
mysql، أنشئ قاعدة بيانات.CREATE DATABASE sampledb;قم بإنهاء اتصال الخادم بكتابة
quit.quit
إنشاء تطبيق PHP محليًا
يمكنك في هذه الخطوة الحصول على تطبيق عينة Laravel وتكوين اتصال قاعدة بياناته وتشغيله محليًا.
استنساخ العينة
في نافذة المحطة الطرفية، cd إلى دليل عمل.
استنساخ مستودع عينة وتغيير إلى جذر المستودع.
git clone https://github.com/Azure-Samples/laravel-tasks cd laravel-tasksتأكد من أن الفرع الافتراضي هو
main.git branch -m mainتلميح
لا تتطلب App Service تغيير اسم الفرع. ولكن ، نظرا لأن العديد من المستودعات تقوم بتغيير فرعها الافتراضي إلى
main، يوضح لك هذا البرنامج التعليمي أيضا كيفية نشر مستودع منmain. للحصول على مزيدٍ من المعلومات، راجع تغيير فرع التوزيع.قم بتثبيت الحزم المطلوبة.
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.
إنشاء العينة محليًا
ابدأ تشغيل عمليات ترحيل قاعدة بيانات Laravel لإنشاء الجداول التي يحتاجها التطبيق. وللاطلاع على الجداول التي يتم إنشاؤها في عمليات الترحيل، ابحث في دليل قاعدة البيانات/عمليات الترحيل في مستودع Git.
php artisan migrateأنشئ مفتاح تطبيق Laravel جديدًا.
php artisan key:generateشغّل التطبيق.
php artisan serveانتقل إلى
http://localhost:8000في المستعرض. أضف بعض المهام في الصفحة.
لإيقاف 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 >
}
تكوين جدار حماية الخادم
في 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 الصادرة فقط التي يستخدمها التطبيق.
في 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>
إنشاء قاعدة بيانات إنتاج
في نافذة المحطة الطرفية المحلية، اتصل بخادم MySQL في Azure. استخدم القيمة التي حددتها مسبقا للمسؤول-المستخدم<>واسم<> خادم mysql. عند مطالبتك بإدخال كلمة مرور، استخدم كلمة المرور التي حددتها عند إنشاء قاعدة البيانات في Azure.
mysql -u <admin-user>@<mysql-server-name> -h <mysql-server-name>.mysql.database.azure.com -P 3306 -pعند مطالبة
mysql، أنشئ قاعدة بيانات.CREATE DATABASE sampledb;أنشئ مستخدم قاعدة بيانات يحمل اسم phpappuser وامنحه كافة الامتيازات في قاعدة بيانات
sampledb. ولأغراض تبسيط البرنامج التعليمي، استخدم MySQLAzure2017 ككلمة مرور.CREATE USER 'phpappuser' IDENTIFIED BY 'MySQLAzure2017'; GRANT ALL PRIVILEGES ON sampledb.* TO 'phpappuser';قم بإنهاء اتصال الخادم عن طريق إدخال
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 في مستودع لأغراض التسهيل في هذا البرنامج التعليمي.
اختبر التطبيق محليًا
ابدأ تشغيل عمليات ترحيل قاعدة بيانات Laravel باستخدام .env.production كملف البيئة لإنشاء الجداول في قاعدة بيانات MySQL الموجودة في قاعدة بيانات Azure لخادم MySQL. وتذكر أن .env.production يمتلك معلومات الاتصال بقاعدة بيانات MySQL في Azure.
php artisan migrate --env=production --forceولا يملك .env.production مفتاح تطبيق صالحًا حتى الآن. فأنشئ مفتاحًا جديدًا لهذا الغرض في المحطة الطرفية.
php artisan key:generate --env=production --forceابدأ تشغيل تطبيق العينة باستخدام .env.production كملف البيئة.
php artisan serve --env=productionانتقل إلى
http://localhost:8000. في حال تحميل الصفحة دون وجود أخطاء، فإن تطبيق PHP يتصل بقاعدة بيانات MySQL في Azure.أضف بعض المهام في الصفحة.

لإيقاف 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. حيث يمكنك تكوينه باستخدام إعدادات التطبيق.
وفي نافذة المحطة الطرفية المحلية، استخدم
php artisanلإنشاء مفتاح تطبيق جديد دون حفظه إلى .env.php artisan key:generate --showفي 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
نظرًا لأنك تقوم بنشر
main الفرع، فأنت بحاجة إلى تعيين فرع النشر الافتراضي لتطبيقي App Servicemain(انظر تغيير فرع النشر). في Cloud Shell، اضبطDEPLOYMENT_BRANCHإعداد التطبيق باستخدامaz webapp config appsettings setالأمر.az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DEPLOYMENT_BRANCH='main'بالرجوع إلى نافذة المحطة الطرفية المحلية، أضف جهاز تحكم عن بعد لـ Azure إلى مستودع Git المحلي. استبدل <النشرLocalGitUrl-from-create-step> بعنوان URL الخاص بجهاز التحكم عن بعد Git الذي قمت بحفظه من إنشاء تطبيق ويب.
git remote add azure <deploymentLocalGitUrl-from-create-step>اضغط على جهاز التحكم عن بعد لـ 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. للحصول على مزيدٍ من المعلومات، راجع البرنامج النصي للتوزيع المخصص.
نظرًا لأنك تقوم بنشر
main الفرع، فأنت بحاجة إلى تعيين فرع النشر الافتراضي لتطبيقي App Servicemain(انظر تغيير فرع النشر). في Cloud Shell، اضبطDEPLOYMENT_BRANCHإعداد التطبيق باستخدامaz webapp config appsettings setالأمر.az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DEPLOYMENT_BRANCH='main'بالرجوع إلى نافذة المحطة الطرفية المحلية، أضف جهاز تحكم عن بعد لـ Azure إلى مستودع Git المحلي. استبدل <النشرLocalGitUrl-from-create-step> بعنوان URL الخاص بجهاز التحكم عن بعد Git الذي قمت بحفظه من إنشاء تطبيق ويب.
git remote add azure <deploymentLocalGitUrl-from-create-step>اضغط على جهاز التحكم عن بعد لـ 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، وأضف بعض المهام إلى القائمة.
تهانينا، لقد بدأت تشغيل تطبيق PHP يستند إلى البيانات في Azure App Service.
تحديث النموذج محليًا وإعادة التوزيع
يمكنك في هذه الخطوة إجراء تغيير بسيط على نموذج بيانات task وتطبيق الويب، ثم نشر التحديث إلى Azure.
بالنسبة لسيناريو المهام، يمكنك تغيير التطبيق بحيث يمكنك وضع علامة على مهمة على أنها مكتملة.
إضافة عمود
في نافذة المحطة الطرفية المحلية، انتقل إلى جذر مستودع Git.
أنشئ ترحيل قاعدة بيانات جديدة لجدول
tasks:php artisan make:migration add_complete_column --table=tasksيوضح لك هذا الأمر اسم ملف الترحيل الذي جرى إنشاؤه. ابحث عن هذا الملف في database/migrations وافتحه.
استبدل الأسلوب
upبالتعليمات البرمجية التالية:public function up() { Schema::table('tasks', function (Blueprint $table) { $table->boolean('complete')->default(False); }); }تضيف التعليمات البرمجية السابقة عمودًا منطقيًا في جدول
tasksوالذي يُسمىcomplete.استبدل أسلوب
downبالتعليمات البرمجية التالية لإجراء العودة إلى الحالة السابقة:public function down() { Schema::table('tasks', function (Blueprint $table) { $table->dropColumn('complete'); }); }في نافذة المحطة الطرفية المحلية، ابدأ تشغيل عمليات ترحيل قاعدة بيانات Laravel لإجراء التغيير في قاعدة البيانات المحلية.
php artisan migrateاستنادًا إلى اصطلاح تسمية Laravel، يتم تعيين النموذج
Task(راجع app/Task.php) للجدولtasksبشكل افتراضي.
تحديث منطق التطبيق
افتح ملف routes/web.php. ويحدد التطبيق مساراته ومنطق العمل هنا.
وفي نهاية الملف، أضف مسارًا إلى جانب التعليمات البرمجية التالية:
/** * 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.
تحديث طريقة العرض
افتح ملف resources/views/tasks.blade.php. ابحث عن علامة بداية
<tr>، واستبدلها بما يلي:<tr class="{{ $task->complete ? 'success' : 'active' }}" >تقوم التعليمات البرمجية السابقة بتغيير لون الصف استنادًا إلى ما إذا كانت المهمة مكتملة من عدمه.
وفي السطر التالي، تكون لديك التعليمات البرمجية التالية:
<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>تضيف التعليمات البرمجية السابقة الزر "إرسال" الذي يشير إلى المسار الذي حددته في وقت سابق.
اختبار التغييرات محليًا
في نافذة المحطة الطرفية المحلية، ابدأ تشغيل خادم التطوير من الدليل الجذر الخاص بمستودع Git.
php artisan serveلرؤية تغيير حالة المهمة، انتقل إلى
http://localhost:8000خانة الاختيار وحددها.
لإيقاف PHP ، أدخل
Ctrl + Cفي المحطة.
نشر التغييرات على Azure
في نافذة المحطة الطرفية المحلية، ابدأ تشغيل عمليات ترحيل قاعدة بيانات Laravel باستخدام سلسلة اتصال الإنتاج لإجراء التغيير في قاعدة بيانات Azure.
php artisan migrate --env=production --forceقم بتنفيذ كافة التغييرات في Git، ثم انقل تغييرات التعليمات البرمجية إلى Azure.
git add . git commit -m "added complete checkbox" git push azure mainبمجرد اكتمال العملية
git push، انتقل إلى تطبيق 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
انتقل إلى مدخل Microsoft Azure لإدارة التطبيق الذي أنشأته.
من القائمة اليمنى، حدد خدمات التطبيق، ثم حدد اسم تطبيق Azure.

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

تنظيف الموارد
في الخطوات السابقة، أنشأت موارد Azure في مجموعة الموارد. إذا لم تتوقع احتياجك لهذه الموارد في المستقبل، فاحذف مجموعة الموارد من خلال تشغيل الأمر التالي في Cloud Shell:
az group delete --name myResourceGroup
ربما يستغرق الأمر بضع دقائق للتشغيل.
الخطوات التالية
تعلمت في هذا البرنامج التعليمي كيفية:
- إنشاء قاعدة بيانات MySQL في Azure
- ربط تطبيق PHP بـ MySQL
- توزيع التطبيق على Azure
- تحديث نموذج البيانات وإعادة نشر التطبيق
- تدفق سجلات التشخيص من Azure
- إدارة التطبيق في مدخل Azure
انتقل إلى البرنامج التعليمي التالي لمعرفة كيفية تعيين اسم DNS مخصص إلى التطبيق.
أو، يمكنك التحقق من الموارد الأخرى:
