تكوين تطبيق PHP لخدمة تطبيقات Azure

يوضح لك هذا الدليل كيفية تكوين تطبيقات ويب PHP والنهايات الخلفية للجوال وتطبيقات واجهة برمجة التطبيقات في Azure App Service.

يوفر هذا الدليل المفاهيم والإرشادات الأساسية لمطوري PHP الذين ينشرون التطبيقات في App Service. إذا لم يسبق لك استخدام خدمة تطبيقات Azure ، فاتبع البرنامج التعليمي PHP quickstart و PHP مع MySQL أولا.

إظهار إصدار PHP

لإظهار إصدار PHP الحالي، قم بتشغيل الأمر التالي في Cloud Shell:

az webapp config show --resource-group <resource-group-name> --name <app-name> --query phpVersion

ملاحظة

لمعالجة فتحة تطوير، قم بتضمين المعلمة --slot متبوعة باسم الفتحة.

لإظهار كافة إصدارات PHP المدعومة، قم بتشغيل الأمر التالي في Cloud Shell:

az webapp list-runtimes --os windows | grep php

لإظهار إصدار PHP الحالي، قم بتشغيل الأمر التالي في Cloud Shell:

az webapp config show --resource-group <resource-group-name> --name <app-name> --query linuxFxVersion

ملاحظة

لمعالجة فتحة تطوير، قم بتضمين المعلمة --slot متبوعة باسم الفتحة.

لإظهار كافة إصدارات PHP المدعومة، قم بتشغيل الأمر التالي في Cloud Shell:

az webapp list-runtimes --os linux | grep PHP

تعيين إصدار PHP

قم بتشغيل الأمر التالي في Cloud Shell لتعيين إصدار PHP إلى 8.0:

az webapp config set --resource-group <resource-group-name> --name <app-name> --php-version 8.0

قم بتشغيل الأمر التالي في Cloud Shell لتعيين إصدار PHP إلى 8.0:

az webapp config set --resource-group <resource-group-name> --name <app-name> --linux-fx-version "PHP|8.0"

تشغيل الملحن

إذا كنت تريد أن تقوم App Service بتشغيل Composer في وقت النشر، فإن أسهل طريقة هي تضمين الملحن في المستودع.

من نافذة طرفية محلية، قم بتغيير الدليل إلى جذر المستودع، واتبع الإرشادات الموجودة في تنزيل Composer لتنزيل composer.phar إلى جذر الدليل.

قم بتشغيل الأوامر التالية (تحتاج إلى تثبيت npm ):

npm install kuduscript -g
kuduscript --node --scriptType bash --suppressPrompt

يحتوي جذر المستودع الآن على ملفين إضافيين: .deployment و deploy.sh.

افتح deploy.sh وابحث عن Deployment القسم الذي يبدو كما يلي:

##################################################################################################################################
# Deployment
# ----------

أضف قسم التعليمات البرمجية الذي تحتاجه لتشغيل الأداة المطلوبة في نهايةDeployment القسم:

# 4. Use composer
echo "$DEPLOYMENT_TARGET"
if [ -e "$DEPLOYMENT_TARGET/composer.json" ]; then
  echo "Found composer.json"
  pushd "$DEPLOYMENT_TARGET"
  php composer.phar install $COMPOSER_ARGS
  exitWithMessageOnError "Composer install failed"
  popd
fi

نفذ جميع التغييرات الخاصة بك وانشر التعليمات البرمجية الخاصة بك باستخدام Git ، أو نشر الرمز البريدي مع تمكين أتمتة الإنشاء. يجب أن يتم تشغيل الملحن الآن كجزء من أتمتة النشر.

تشغيل النخر / باور / بلع

إذا كنت تريد أن تقوم App Service بتشغيل أدوات التشغيل الآلي الشائعة في وقت النشر، مثل Grunt أو Bower أو Gulp، فأنت بحاجة إلى توفير برنامج نصي مخصص للنشر. تقوم App Service بتشغيل هذا البرنامج النصي عند النشر باستخدام Git، أو مع نشر Zipمع تمكين التشغيل التلقائي للبناء.

لتمكين المستودع الخاص بك من تشغيل هذه الأدوات، تحتاج إلى إضافتها إلى التبعيات في package.json. على سبيل المثال:

"dependencies": {
  "bower": "^1.7.9",
  "grunt": "^1.0.1",
  "gulp": "^3.9.1",
  ...
}

من نافذة طرفية محلية ، قم بتغيير الدليل إلى جذر المستودع الخاص بك وقم بتشغيل الأوامر التالية (تحتاج إلى تثبيت npm ):

npm install kuduscript -g
kuduscript --node --scriptType bash --suppressPrompt

يحتوي جذر المستودع الآن على ملفين إضافيين: .deployment و deploy.sh.

افتح deploy.sh وابحث عن Deployment القسم الذي يبدو كما يلي:

##################################################################################################################################
# Deployment
# ----------

ينتهي هذا القسم بتشغيل npm install --production. أضف قسم التعليمات البرمجية الذي تحتاجه لتشغيل الأداة المطلوبة في نهايةDeployment القسم:

راجع مثالا في نموذج MEAN.js، حيث يقوم البرنامج النصي للنشر أيضا بتشغيل أمر مخصص npm install .

باور

يتم تشغيل bower installهذا المقتطف .

if [ -e "$DEPLOYMENT_TARGET/bower.json" ]; then
  cd "$DEPLOYMENT_TARGET"
  eval ./node_modules/.bin/bower install
  exitWithMessageOnError "bower failed"
  cd - > /dev/null
fi

جرع

يتم تشغيل gulp imageminهذا المقتطف .

if [ -e "$DEPLOYMENT_TARGET/gulpfile.js" ]; then
  cd "$DEPLOYMENT_TARGET"
  eval ./node_modules/.bin/gulp imagemin
  exitWithMessageOnError "gulp failed"
  cd - > /dev/null
fi

نعر

يتم تشغيل gruntهذا المقتطف .

if [ -e "$DEPLOYMENT_TARGET/Gruntfile.js" ]; then
  cd "$DEPLOYMENT_TARGET"
  eval ./node_modules/.bin/grunt
  exitWithMessageOnError "Grunt failed"
  cd - > /dev/null
fi

تخصيص أتمتة البناء

إذا قمت بنشر تطبيقك باستخدام Git، أو باستخدام حزم zip مع تمكين التشغيل التلقائي للبناء، فإن خطوات أتمتة إنشاء خدمة التطبيقات من خلال التسلسل التالي:

  1. قم بتشغيل برنامج نصي مخصص إذا تم تحديده بواسطة PRE_BUILD_SCRIPT_PATH.
  2. قم بتشغيل php composer.phar install.
  3. قم بتشغيل برنامج نصي مخصص إذا تم تحديده بواسطة POST_BUILD_SCRIPT_PATH.

PRE_BUILD_COMMAND وهي POST_BUILD_COMMAND متغيرات البيئة الفارغة افتراضيا. لتشغيل أوامر ما قبل الإنشاء، حدد PRE_BUILD_COMMAND. لتشغيل أوامر ما بعد الإنشاء، حدد POST_BUILD_COMMAND.

يحدد المثال التالي المتغيرين لسلسلة من الأوامر، مفصولة بفواصل.

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PRE_BUILD_COMMAND="echo foo, scripts/prebuild.sh"
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings POST_BUILD_COMMAND="echo foo, scripts/postbuild.sh"

للحصول على متغيرات بيئة إضافية لتخصيص أتمتة البناء، راجع تكوين Oryx.

لمزيد من المعلومات حول كيفية تشغيل App Service لتطبيقات PHP وإنشائها في Linux، راجع وثائق Oryx: كيفية اكتشاف تطبيقات PHP وإنشائها.

تخصيص بدء التشغيل

بشكل افتراضي ، تقوم حاوية PHP المضمنة بتشغيل خادم Apache. عند بدء التشغيل ، يتم تشغيله apache2ctl -D FOREGROUND". إذا أردت، يمكنك تشغيل أمر مختلف عند بدء التشغيل، عن طريق تشغيل الأمر التالي في Cloud Shell:

az webapp config set --resource-group <resource-group-name> --name <app-name> --startup-file "<custom-command>"

الوصول إلى متغيرات البيئة

في App Service، يمكنك تعيين إعدادات التطبيق خارج التعليمات البرمجية للتطبيق. ثم يمكنك الوصول إليها باستخدام نمط getenv() القياسي. على سبيل المثال، للوصول إلى إعداد تطبيق يسمى DB_HOST، استخدم التعليمات البرمجية التالية:

getenv("DB_HOST")

تغيير جذر الموقع

قد يستخدم إطار الويب الذي تختاره دليلا فرعيا كجذر للموقع. على سبيل المثال ، يستخدم Laravel الدليل العام / الفرعي كجذر للموقع.

لتخصيص جذر الموقع، قم بتعيين مسار التطبيق الظاهري للتطبيق باستخدام الأمر az resource update . يقوم المثال التالي بتعيين جذر الموقع إلى الدليل العام / الفرعي في المستودع الخاص بك.

az resource update --name web --resource-group <group-name> --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).

قد يستخدم إطار الويب الذي تختاره دليلا فرعيا كجذر للموقع. على سبيل المثال ، يستخدم Laravelpublic/ الدليل الفرعي كجذر الموقع.

تستخدم صورة PHP الافتراضية لخدمة التطبيقات Apache ، ولا تتيح لك تخصيص جذر الموقع لتطبيقك. كمحاولة للتغلب على هذا القيد قم بإضافة ملف htaccess إلى جذر المستودع الخاص بك مع المحتوى التالي:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_URI} ^(.*)
    RewriteRule ^(.*)$ /public/$1 [NC,L,QSA]
</IfModule>

إذا كنت تفضل عدم استخدام إعادة كتابة . htaccess ، فيمكنك نشر تطبيق Laravel الخاص بك مع صورة Docker مخصصة بدلا من ذلك.

الكشف عن جلسة عمل HTTPS

في خدمة التطبيقات، يحدث إنهاء طبقة النقل الآمنة/طبقة المقابس الآمنة (TLS) في موازنات تحميل الشبكة، بحيث تصل جميع طلبات HTTPS إلى تطبيقك كطلبات HTTP غير مشفرة. إذا كان منطق التطبيق الخاص بك يحتاج إلى التحقق مما إذا كانت طلبات المستخدم مشفرة أم لا، فافحص ترويسة X-Forwarded-Proto.

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
// Do something when HTTPS is used
}

وتتيح لك أطر عمل الويب الشائعة الوصول إلى معلومات X-Forwarded-* في نمط التطبيق القياسي. في CodeIgniter، يتحقق is_https() من قيمة X_FORWARDED_PROTO بشكل افتراضي.

تخصيص إعدادات php.ini

إذا كنت بحاجة إلى إجراء تغييرات على تثبيت PHP، فيمكنك تغيير أي من توجيهاتphp.ini باتباع الخطوات التالية.

ملاحظة

أفضل طريقة لرؤية إصدار PHP وتكوين php.ini الحالي هي الاتصال ب phpinfo() في تطبيقك.

تخصيص التوجيهات غير PHP_INI_SYSTEM

لتخصيص توجيهات PHP_INI_USER PHP_INI_PERDIR PHP_INI_ALL (راجع توجيهاتphp.ini)، أضف ملفا .user.ini إلى الدليل الجذر لتطبيقك.

أضف إعدادات التكوين .user.ini إلى الملف باستخدام نفس بناء الجملة الذي ستستخدمه في php.ini ملف. على سبيل المثال، إذا كنت تريد تشغيل display_errors الإعداد وتعيين upload_max_filesize الإعداد إلى 10M، فسيحتوي ملفك .user.ini على هذا النص:

 ; Example Settings
 display_errors=On
 upload_max_filesize=10M

 ; Write errors to d:\home\LogFiles\php_errors.log
 ; log_errors=On

أعد نشر تطبيقك باستخدام التغييرات وأعد تشغيله.

كبديل لاستخدام .user.ini ملف، يمكنك استخدام ini_set() في تطبيقك لتخصيص هذه التوجيهات غير PHP_INI_SYSTEM.

لتخصيص توجيهات PHP_INI_USER PHP_INI_PERDIR PHP_INI_ALL (راجع توجيهاتphp.ini)، أضف ملف . htaccess إلى الدليل الجذر لتطبيقك.

في ملف . htaccess ، أضف التوجيهات باستخدام بناء الجملة php_value <directive-name> <value> . على سبيل المثال:

php_value upload_max_filesize 1000M
php_value post_max_size 2000M
php_value memory_limit 3000M
php_value max_execution_time 180
php_value max_input_time 180
php_value display_errors On
php_value upload_max_filesize 10M

أعد نشر تطبيقك باستخدام التغييرات وأعد تشغيله. إذا قمت بنشره باستخدام Kudu (على سبيل المثال، باستخدام Git)، إعادة تشغيله تلقائيا بعد النشر.

كبديل لاستخدام . htaccess، يمكنك استخدام ini_set() في تطبيقك لتخصيص هذه التوجيهات غير PHP_INI_SYSTEM.

تخصيص توجيهات PHP_INI_SYSTEM

لتخصيص توجيهات PHP_INI_SYSTEM (راجع توجيهاتphp.ini)، لا يمكنك استخدام نهج .htaccess. توفر خدمة التطبيق آلية منفصلة باستخدام PHP_INI_SCAN_DIR إعداد التطبيق.

أولا ، قم بتشغيل الأمر التالي في Cloud Shell لإضافة إعداد تطبيق يسمى PHP_INI_SCAN_DIR:

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PHP_INI_SCAN_DIR="d:\home\site\ini"

انتقل إلى وحدة تحكم Kudu (https://<app-name>.scm.azurewebsites.net/DebugConsole) وانتقل إلى d:\home\site.

قم بإنشاء دليل باسم d:\home\siteini، ثم قم بإنشاء ملف .ini في d:\home\site\ini الدليل (على سبيل المثال ، settings.ini) مع التوجيهات التي تريد تخصيصها. استخدم نفس بناء الجملة الذي ستستخدمه في ملف php.ini .

على سبيل المثال، لتغيير قيمة expose_php قم بتشغيل الأوامر التالية:

cd /home/site
mkdir ini
echo "expose_php = Off" >> ini/setting.ini

لكي تصبح التغييرات سارية المفعول، أعد تشغيل التطبيق.

لتخصيص توجيهات PHP_INI_SYSTEM (راجع توجيهاتphp.ini)، لا يمكنك استخدام نهج .htaccess. توفر خدمة التطبيق آلية منفصلة باستخدام PHP_INI_SCAN_DIR إعداد التطبيق.

أولا ، قم بتشغيل الأمر التالي في Cloud Shell لإضافة إعداد تطبيق يسمى PHP_INI_SCAN_DIR:

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PHP_INI_SCAN_DIR="/usr/local/etc/php/conf.d:/home/site/ini"

/usr/local/etc/php/conf.d هو الدليل الافتراضي حيث يوجدphp.ini . /home/site/ini هو الدليل المخصص الذي ستضيف فيه ملف .ini مخصصا. يمكنك فصل القيم باستخدام :ملف .

انتقل إلى جلسة SSH على الويب باستخدام حاوية Linux (https://<app-name>.scm.azurewebsites.net/webssh/host).

قم بإنشاء دليل باسم /home/siteini، ثم قم بإنشاء ملف .ini في /home/site/ini الدليل (على سبيل المثال ، settings.ini) مع التوجيهات التي تريد تخصيصها. استخدم نفس بناء الجملة الذي ستستخدمه في ملف php.ini .

تلميح

في حاويات Linux المضمنة في App Service ، يتم استخدام /home كوحدة تخزين مشتركة مستمرة.

على سبيل المثال، لتغيير قيمة expose_php قم بتشغيل الأوامر التالية:

cd /home/site
mkdir ini
echo "expose_php = Off" >> ini/setting.ini

لكي تصبح التغييرات سارية المفعول، أعد تشغيل التطبيق.

تمكين ملحقات PHP

تحتوي عمليات تثبيت PHP المضمنة على الإضافات الأكثر استخداما. يمكنك تمكين ملحقات إضافية بنفس الطريقة التي تقوم بها بتخصيص توجيهات php.ini.

ملاحظة

أفضل طريقة لرؤية إصدار PHP وتكوين php.ini الحالي هي الاتصال ب phpinfo() في تطبيقك.

لتمكين ملحقات إضافية، باتباع الخطوات التالية:

bin أضف دليلا إلى الدليل الجذر لتطبيقك وضع ملفات الملحقات .dll فيه (على سبيل المثال، mongodb.dll). تأكد من أن الملحقات متوافقة مع إصدار PHP في Azure ومتوافقة مع VC9 وغير آمنة لمؤشر الترابط (nts).

نشر التغييرات التي أجريتها.

اتبع الخطوات الواردة في تخصيص توجيهات PHP_INI_SYSTEM، وإضافة الملحقات إلى ملف .ini المخصص مع التوجيهات الملحقة أو zend_extension .

extension=d:\home\site\wwwroot\bin\mongodb.dll
zend_extension=d:\home\site\wwwroot\bin\xdebug.dll

لكي تصبح التغييرات سارية المفعول، أعد تشغيل التطبيق.

تحتوي عمليات تثبيت PHP المضمنة على الإضافات الأكثر استخداما. يمكنك تمكين ملحقات إضافية بنفس الطريقة التي تقوم بها بتخصيص توجيهات php.ini.

ملاحظة

أفضل طريقة لرؤية إصدار PHP وتكوين php.ini الحالي هي الاتصال ب phpinfo() في تطبيقك.

لتمكين ملحقات إضافية، باتباع الخطوات التالية:

bin أضف دليلا إلى الدليل الجذر لتطبيقك وضع ملفات الملحقات .so فيه (على سبيل المثال، mongodb.so). تأكد من أن الملحقات متوافقة مع إصدار PHP في Azure ومتوافقة مع VC9 وغير آمنة لمؤشر الترابط (nts).

نشر التغييرات التي أجريتها.

اتبع الخطوات الواردة في تخصيص توجيهات PHP_INI_SYSTEM، وإضافة الملحقات إلى ملف .ini المخصص مع التوجيهات الملحقة أو zend_extension .

extension=/home/site/wwwroot/bin/mongodb.so
zend_extension=/home/site/wwwroot/bin/xdebug.so

لكي تصبح التغييرات سارية المفعول، أعد تشغيل التطبيق.

الوصول إلى سجلات التشخيص

استخدم الأداة المساعدة error_log() القياسية لجعل سجلات التشخيص تظهر في Azure App Service.

للوصول إلى سجلات وحدة التحكم التي تم إنشاؤها من داخل التعليمة البرمجية للتطبيق في خدمة التطبيقات، قم بتشغيل تسجيل التشخيص عن طريق تشغيل الأمر التالي في 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.

يمكنك الوصول إلى سجلات وحدة التحكم المنشأة من داخل الحاوية.

أولًا، قم بتشغيل تسجيل الحاويات عن طريق تشغيل الأمر التالي:

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

استبدل <app-name> و<resource-group-name> بالأسماء المناسبة لتطبيق الويب الخاص بك.

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

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

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

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

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

استكشاف الأخطاء وإصلاحها

عندما يتصرف تطبيق PHP يعمل بشكل مختلف في App Service أو يحتوي على أخطاء، جرب ما يلي:

  • الوصول إلى دفق السجل.
  • اختبر التطبيق محليا في وضع الإنتاج. تقوم خدمة التطبيقات بتشغيل تطبيقك في وضع الإنتاج، لذا تحتاج إلى التأكد من أن مشروعك يعمل كما هو متوقع في وضع الإنتاج محليا. على سبيل المثال:
    • اعتمادا على composer.json الخاص بك ، قد يتم تثبيت حزم مختلفة لوضع الإنتاج (require مقابل require-dev).
    • قد تقوم بعض أطر عمل الويب بنشر ملفات ثابتة بشكل مختلف في وضع الإنتاج.
    • قد تستخدم بعض أطر عمل الويب برامج نصية مخصصة لبدء التشغيل عند التشغيل في وضع الإنتاج.
  • قم بتشغيل تطبيقك في App Service في وضع تصحيح الأخطاء. على سبيل المثال ، في Laravel ، يمكنك تكوين تطبيقك لإخراج رسائل تصحيح الأخطاء في الإنتاج عن طريق تعيين APP_DEBUG إعداد التطبيق إلى true.

robots933456 في السجلات

قد تشاهد الرسالة التالية في سجلات الحاوية:

2019-04-08T14:07:56.641002476Z "-" - - [08/Apr/2019:14:07:56 +0000] "GET /robots933456.txt HTTP/1.1" 404 415 "-" "-"

بإمكانك تجاهل تلك الرسالة. /robots933456.txt هو مسار عنوان URL وهمي يستخدم "خدمة التطبيقات" للتحقق من إمكانية تقديم الحاوية "طلبات". يُشير رد 404 ببساطة إلى أن المسار غير موجود، ولكنه يتيح لـ"خدمة التطبيقات" معرفة أن الحاوية سليمة وجاهزة للاستجابة للطلبات.

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

أو راجع موارد إضافية:

متغيرات البيئة ومرجع إعدادات التطبيق