Azure Uygulaması Hizmeti için PHP uygulaması yapılandırma
PHP sürümünü göster
Bu kılavuzda, Azure Uygulaması Hizmeti'nde PHP web uygulamalarınızı, mobil arka uçlarınızı ve API uygulamalarınızı nasıl yapılandırabileceğiniz gösterilir.
Bu kılavuz, App Service'e uygulama dağıtan PHP geliştiricileri için önemli kavramlar ve yönergeler sağlar. Azure Uygulaması Hizmetini hiç kullanmadıysanız önce MySQL ile PHP hızlı başlangıcını ve PHP öğreticisini izleyin.
Geçerli PHP sürümünü göstermek için Cloud Shell'de aşağıdaki komutu çalıştırın:
az webapp config show --resource-group <resource-group-name> --name <app-name> --query phpVersion
Dekont
Geliştirme yuvasını ele almak için parametresini --slot
ve ardından yuvanın adını ekleyin.
Desteklenen tüm PHP sürümlerini göstermek için Cloud Shell'de aşağıdaki komutu çalıştırın:
az webapp list-runtimes --os windows | grep PHP
Bu kılavuzda, Azure Uygulaması Hizmeti'nde PHP web uygulamalarınızı, mobil arka uçlarınızı ve API uygulamalarınızı nasıl yapılandırabileceğiniz gösterilir.
Bu kılavuz, App Service'e uygulama dağıtan PHP geliştiricileri için önemli kavramlar ve yönergeler sağlar. Azure Uygulaması Hizmetini hiç kullanmadıysanız önce MySQL ile PHP hızlı başlangıcını ve PHP öğreticisini izleyin.
Geçerli PHP sürümünü göstermek için Cloud Shell'de aşağıdaki komutu çalıştırın:
az webapp config show --resource-group <resource-group-name> --name <app-name> --query linuxFxVersion
Dekont
Geliştirme yuvasını ele almak için parametresini --slot
ve ardından yuvanın adını ekleyin.
Desteklenen tüm PHP sürümlerini göstermek için Cloud Shell'de aşağıdaki komutu çalıştırın:
az webapp list-runtimes --os linux | grep PHP
PHP sürümünü ayarlama
CLOUD Shell'de aşağıdaki komutu çalıştırarak PHP sürümünü 8.1 olarak ayarlayın:
az webapp config set --resource-group <resource-group-name> --name <app-name> --php-version 8.1
CLOUD Shell'de aşağıdaki komutu çalıştırarak PHP sürümünü 8.1 olarak ayarlayın:
az webapp config set --resource-group <resource-group-name> --name <app-name> --linux-fx-version "PHP|8.1"
Composer'ı çalıştırma
App Service'in dağıtım zamanında Oluşturucu'yu çalıştırmasını istiyorsanız, en kolay yol Deponuza Oluşturucu'yu dahil etmektir.
Yerel terminal penceresinden dizini deponuzun köküne değiştirin ve composer.phar dosyasını dizin köküne indirmek için Composer'ı indirme yönergelerini izleyin.
Aşağıdaki komutları çalıştırın (npm'nin yüklü olması gerekir):
npm install kuduscript -g
kuduscript --node --scriptType bash --suppressPrompt
Depo kökünüzün artık iki ek dosyası vardır: .deployment ve deploy.sh.
deploy.sh açın ve şu şekilde görünen bölümü bulunDeployment
:
##################################################################################################################################
# Deployment
# ----------
Bölümün sonuna Deployment
gerekli aracı çalıştırmak için ihtiyacınız olan kod bölümünü ekleyin:
# 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
Tüm değişikliklerinizi işleyin ve Git'i kullanarak kodunuzu dağıtın veya derleme otomasyonu etkinken Zip dağıtımı yapın. Oluşturucu artık dağıtım otomasyonunun bir parçası olarak çalışıyor olmalıdır.
Grunt/Bower/Gulp çalıştırma
App Service'in dağıtım zamanında Grunt, Bower veya Gulp gibi popüler otomasyon araçlarını çalıştırmasını istiyorsanız, özel bir dağıtım betiği sağlamanız gerekir. App Service bu betiği Git ile dağıttığınızda veya derleme otomasyonu etkin zip dağıtımıyla çalıştırdığında çalıştırır.
Deponuzun bu araçları çalıştırmasını sağlamak için bunları package.json dosyasındaki bağımlılıklara eklemeniz gerekir. Örneğin:
"dependencies": {
"bower": "^1.7.9",
"grunt": "^1.0.1",
"gulp": "^3.9.1",
...
}
Yerel terminal penceresinden dizini depo kök dizininizle değiştirin ve aşağıdaki komutları çalıştırın (npm'nin yüklü olması gerekir):
npm install kuduscript -g
kuduscript --node --scriptType bash --suppressPrompt
Depo kökünüzün artık iki ek dosyası vardır: .deployment ve deploy.sh.
deploy.sh açın ve şu şekilde görünen bölümü bulunDeployment
:
##################################################################################################################################
# Deployment
# ----------
Bu bölüm, komutunun çalıştırılmasıyla npm install --production
sona erer. Bölümün sonuna Deployment
gerekli aracı çalıştırmak için ihtiyacınız olan kod bölümünü ekleyin:
Dağıtım betiğinin özel bir komut da çalıştırdığı MEAN.js örneğindeki bir npm install
örneğe bakın.
Bower
Bu kod parçacığı çalıştırır 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
Bu kod parçacığı çalıştırır 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
Bu kod parçacığı çalıştırır grunt
.
if [ -e "$DEPLOYMENT_TARGET/Gruntfile.js" ]; then
cd "$DEPLOYMENT_TARGET"
eval ./node_modules/.bin/grunt
exitWithMessageOnError "Grunt failed"
cd - > /dev/null
fi
Derleme otomasyonunu özelleştirme
Uygulamanızı Git kullanarak veya derleme otomasyonu etkin zip paketleri kullanarak dağıtırsanız, App Service derleme otomasyonu aşağıdaki sırayla adım adım ilerler:
- tarafından
PRE_BUILD_SCRIPT_PATH
belirtilirse özel betiği çalıştırın. php composer.phar install
'i çalıştırın.- tarafından
POST_BUILD_SCRIPT_PATH
belirtilirse özel betiği çalıştırın.
PRE_BUILD_COMMAND
ve POST_BUILD_COMMAND
varsayılan olarak boş olan ortam değişkenleridir. Derleme öncesi komutları çalıştırmak için tanımlayın PRE_BUILD_COMMAND
. Derleme sonrası komutları çalıştırmak için tanımlayın POST_BUILD_COMMAND
.
Aşağıdaki örnek, virgülle ayrılmış bir dizi komut için iki değişkeni belirtir.
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"
Derleme otomasyonlarını özelleştirmek için ek ortam değişkenleri için bkz . Oryx yapılandırması.
App Service'in Linux'ta PHP uygulamalarını nasıl çalıştırıp oluşturduğu hakkında daha fazla bilgi için Oryx belgelerine bakın : PHP uygulamaları nasıl algılanıp oluşturulur?
Başlatmayı özelleştirme
İsterseniz Cloud Shell'de aşağıdaki komutu çalıştırarak kapsayıcı başlatma zamanında özel bir komut çalıştırabilirsiniz:
az webapp config set --resource-group <resource-group-name> --name <app-name> --startup-file "<custom-command>"
Ortam değişkenlerine erişme
App Service'te uygulama kodunuzun dışında uygulama ayarlarını düzenleyebilirsiniz. Ardından standart getenv() desenini kullanarak bunlara erişebilirsiniz. Örneğin DB_HOST
adlı bir uygulama ayarına erişmek için şu kodu kullanabilirsiniz:
getenv("DB_HOST")
Site kökünü değiştirme
Seçtiğiniz web çerçevesi, site kökü olarak bir alt dizin kullanabilir. Örneğin Laravel, site kökü olarak ortak/ alt dizinini kullanır.
Site kökünü özelleştirmek için komutunu kullanarak az resource update
uygulamanın sanal uygulama yolunu ayarlayın. Aşağıdaki örnek, site kökünü deponuzdaki ortak/ alt dizine ayarlar.
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
Varsayılan olarak Azure App Service, kök sanal uygulama yolunu (/) dağıtılmış uygulama dosyalarının kök dizinine (sites\wwwroot) yönlendirir.
Seçtiğiniz web çerçevesi, site kökü olarak bir alt dizin kullanabilir. Örneğin, Laravel, site kökü olarak alt dizini kullanır public/
.
App Service için varsayılan PHP görüntüsü Nginx kullanır ve Nginx sunucusunu yönergesiyle yapılandırarak site kökünü root
değiştirirsiniz. Bu örnek yapılandırma dosyası , yönergesini değiştiren aşağıdaki kod parçacıklarını root
içerir:
server {
#proxy_cache cache;
#proxy_cache_valid 200 1s;
listen 8080;
listen [::]:8080;
root /home/site/wwwroot/public; # Changed for Laravel
location / {
index index.php index.html index.htm hostingstart.html;
try_files $uri $uri/ /index.php?$args; # Changed for Laravel
}
...
Varsayılan kapsayıcı /etc/nginx/sites-available/default konumunda bulunan yapılandırma dosyasını kullanır. Uygulama yeniden başlatıldığında bu dosyada yaptığınız tüm düzenlemelerin silindiğini unutmayın. Uygulama yeniden başlatmalarında etkili olan bir değişiklik yapmak için aşağıdaki örneğe benzer bir özel başlatma komutu ekleyin:
cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload
Bu komut, varsayılan Nginx yapılandırma dosyasını deponuzun kökünde default adlı bir dosyayla değiştirir ve Nginx'i yeniden başlatır.
HTTPS oturumlarını algılama
App Service'te TLS/SSL sonlandırma ağ yük dengeleyicilerinde gerçekleşir, bu nedenle tüm HTTPS istekleri şifrelenmemiş HTTP istekleri olarak uygulamanıza ulaşır. Uygulama mantığınızın kullanıcı isteklerinin şifrelenmiş olup olmadığını denetlemesi gerekiyorsa X-Forwarded-Proto
üst bilgisini inceleyin.
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
// Do something when HTTPS is used
}
Popüler web çerçeveleri, standart uygulama düzeninizdeki bilgilere erişmenizi X-Forwarded-*
sağlar. CodeIgniter'da is_https() varsayılan olarak değerini X_FORWARDED_PROTO
denetler.
php.ini ayarlarını özelleştirme
PHP yüklemenizde değişiklik yapmanız gerekiyorsa, aşağıdaki adımları izleyerek php.ini yönergelerinden herhangi birini değiştirebilirsiniz.
Dekont
PHP sürümünü ve geçerli php.ini yapılandırmasını görmenin en iyi yolu, uygulamanızda phpinfo() çağırmaktır.
PHP_INI_SYSTEM olmayan yönergeleri özelleştirme
PHP_INI_USER, PHP_INI_PERDIR ve PHP_INI_ALL yönergelerini özelleştirmek için (bkz . php.ini yönergeleri), uygulamanızın kök dizinine bir .user.ini
dosya ekleyin.
Dosyada kullandığınız söz dizimini .user.ini
kullanarak dosyaya php.ini
yapılandırma ayarları ekleyin. Örneğin, ayarı açmak display_errors
ve ayarı 10M olarak ayarlamak upload_max_filesize
istiyorsanız dosyanızda .user.ini
şu metin yer alır:
; Example Settings
display_errors=On
upload_max_filesize=10M
; Write errors to d:\home\LogFiles\php_errors.log
; log_errors=On
Uygulamanızı değişikliklerle yeniden dağıtın ve yeniden başlatın.
Dosya kullanmaya .user.ini
alternatif olarak, bu PHP_INI_SYSTEM olmayan yönergeleri özelleştirmek için uygulamanızda ini_set() kullanabilirsiniz.
upload_max_filesize ve expose_php gibi Linux web uygulamalarına yönelik PHP_INI_USER, PHP_INI_PERDIR ve PHP_INI_ALL yönergelerini özelleştirmek için özel bir "ini" dosyası kullanın. SSH oturumunda oluşturabilirsiniz.
- KUDU sitenize https://< sitename.scm.azurewebsites.net> gidin.
- Üstteki menüden Bash veya SSH'yi seçin.
- Bash/SSH'de "/home/site/wwwroot" dizininize gidin.
- "ini" adlı bir dizin oluşturun (örneğin, mkdir ini).
- Geçerli çalışma dizinini yeni oluşturduğunuz "ini" klasörüyle değiştirin.
Ayarlarınızı eklemek için bir "ini" dosyası oluşturmanız gerekir. Bu örnekte "extensions.ini" kullanılır. Vi, Vim veya Nano gibi dosya düzenleyicileri olmadığından, ayarları dosyaya eklemek için echo kullanacaksınız. "upload_max_filesize" 2M olan 50M olarak değiştirin. Ayarı eklemek ve henüz yoksa bir "extensions.ini" dosyası oluşturmak için aşağıdaki komutu kullanın.
/home/site/wwwroot/ini>echo "upload_max_filesize=50M" >> extensions.ini
/home/site/wwwroot/ini>cat extensions.ini
upload_max_filesize=50M
/home/site/wwwroot/ini>
Ardından Azure portalına gidin ve upload_max_filesize değişikliği uygulamak üzere yeni oluşturduğunuz "ini" dizinini taramak için bir Uygulama Ayarı ekleyin.
- Azure portalına gidin ve App Service Linux PHP uygulamanızı seçin.
- Uygulama için Uygulama Ayarlar'nı seçin.
- Uygulama ayarları bölümünde + Yeni ayar ekle'yi seçin.
- Uygulama Ayarı Adı için "PHP_INI_SCAN_DIR" girin ve değer olarak "/home/site/wwwroot/ini" girin.
- Kaydet düğmesini seçin.
Dekont
GD gibi bir PHP uzantısını yeniden derlediyseniz, Azure Uygulaması Hizmetinde PHP Uzantılarını Yeniden Derleme - PHP Uzantıları Ekleme adımlarını izleyin
PHP_INI_SYSTEM yönergelerini özelleştirme
PHP_INI_SYSTEM yönergelerini özelleştirmek için (bkz. php.ini yönergeleri), uygulama ayarını kullanın PHP_INI_SCAN_DIR
.
İlk olarak Cloud Shell'de aşağıdaki komutu çalıştırarak adlı PHP_INI_SCAN_DIR
bir uygulama ayarı ekleyin:
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings PHP_INI_SCAN_DIR="d:\home\site\ini"
Kudu konsoluna (https://<app-name>.scm.azurewebsites.net/DebugConsole
) gidin ve öğesine d:\home\site
gidin.
içinde d:\home\site
adlı ini
bir dizin oluşturun, ardından özelleştirmek istediğiniz yönergeleri içeren dizinde d:\home\site\ini
bir .ini dosyası (örneğin, settings.ini) oluşturun. Php.ini dosyasında kullandığınız söz dizimini kullanın.
Örneğin, expose_php değerini değiştirmek için aşağıdaki komutları çalıştırın:
cd /home/site
mkdir ini
echo "expose_php = Off" >> ini/setting.ini
Değişikliklerin etkili olması için uygulamayı yeniden başlatın.
PHP_INI_SYSTEM yönergelerini özelleştirmek için (bkz. php.ini yönergeleri), .htaccess yaklaşımını kullanamazsınız. App Service, uygulama ayarını kullanarak PHP_INI_SCAN_DIR
ayrı bir mekanizma sağlar.
İlk olarak Cloud Shell'de aşağıdaki komutu çalıştırarak adlı PHP_INI_SCAN_DIR
bir uygulama ayarı ekleyin:
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 dosyasının bulunduğu varsayılan dizindir. /home/site/ini
, içinde özel bir .ini dosyası ekleyeceğiniz özel dizindir. Değerleri ile :
ayırırsınız.
Linux kapsayıcınızla (https://<app-name>.scm.azurewebsites.net/webssh/host
) web SSH oturumuna gidin.
içinde /home/site
adlı ini
bir dizin oluşturun, ardından özelleştirmek istediğiniz yönergeleri içeren dizinde /home/site/ini
bir .ini dosyası (örneğin, settings.ini) oluşturun. Php.ini dosyasında kullandığınız söz dizimini kullanın.
Bahşiş
App Service'teki yerleşik Linux kapsayıcılarında kalıcı paylaşılan depolama alanı olarak /home kullanılır.
Örneğin, expose_php değerini değiştirmek için aşağıdaki komutları çalıştırın:
cd /home/site
mkdir ini
echo "expose_php = Off" >> ini/setting.ini
Değişikliklerin etkili olması için uygulamayı yeniden başlatın.
PHP uzantılarını etkinleştirme
Yerleşik PHP yüklemeleri en yaygın kullanılan uzantıları içerir. Php.ini yönergelerini özelleştirdiğiniz gibi ek uzantıları etkinleştirebilirsiniz.
Dekont
PHP sürümünü ve geçerli php.ini yapılandırmasını görmenin en iyi yolu, uygulamanızda phpinfo() çağırmaktır.
Ek uzantıları etkinleştirmek için aşağıdaki adımları izleyin:
Uygulamanızın kök dizinine bir bin
dizin ekleyin ve uzantı dosyalarını buna ekleyin .dll
(örneğin, mongodb.dll). Uzantıların Azure'daki PHP sürümüyle uyumlu olduğundan ve VC9 ile iş parçacığı güvenli olmayan (nts) uyumlu olduğundan emin olun.
Değişikliklerinizi dağıtın.
PHP_INI_SYSTEM yönergelerini özelleştirme'deki adımları izleyin, uzantıyı veya zend_extension yönergelerini kullanarak uzantıları özel .ini dosyasına ekleyin.
extension=d:\home\site\wwwroot\bin\mongodb.dll
zend_extension=d:\home\site\wwwroot\bin\xdebug.dll
Değişikliklerin etkili olması için uygulamayı yeniden başlatın.
Yerleşik PHP yüklemeleri en yaygın kullanılan uzantıları içerir. Php.ini yönergelerini özelleştirdiğiniz gibi ek uzantıları etkinleştirebilirsiniz.
Dekont
PHP sürümünü ve geçerli php.ini yapılandırmasını görmenin en iyi yolu, uygulamanızda phpinfo() çağırmaktır.
Ek uzantıları etkinleştirmek için aşağıdaki adımları izleyin:
Uygulamanızın kök dizinine bir bin
dizin ekleyin ve uzantı dosyalarını buna ekleyin .so
(örneğin, mongodb.so). Uzantıların Azure'daki PHP sürümüyle uyumlu olduğundan ve VC9 ile iş parçacığı güvenli olmayan (nts) uyumlu olduğundan emin olun.
Değişikliklerinizi dağıtın.
PHP_INI_SYSTEM yönergelerini özelleştirme'deki adımları izleyin, uzantıyı veya zend_extension yönergelerini kullanarak uzantıları özel .ini dosyasına ekleyin.
extension=/home/site/wwwroot/bin/mongodb.so
zend_extension=/home/site/wwwroot/bin/xdebug.so
Değişikliklerin etkili olması için uygulamayı yeniden başlatın.
Tanılama günlüklerine erişim
Tanılama günlüklerinizin Azure Uygulaması Hizmeti'nde gösterilmesini sağlamak için standart error_log() yardımcı programını kullanın.
App Service’te uygulama kodunuzun içinden oluşturulan konsol günlüklerine erişmek için şu komutu Cloud Shell’de çalıştırarak tanılama günlüğüne kaydetmeyi açın:
az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --level Verbose
--level
için olası değerler: Error
, Warning
, Info
ve Verbose
. Her düzey kendisinden önceki düzeyi içerir. Örneğin: Error
yalnızca hata iletilerini içerir, Verbose
ise tüm iletileri içerir.
Tanılama günlüğüne kaydetme açıldıktan sonra günlük akışını görmek için şu komutu çalıştırın:
az webapp log tail --resource-group <resource-group-name> --name <app-name>
Konsol günlüklerini hemen görmüyorsanız, 30 saniye içinde yeniden kontrol edin.
Dekont
Ayrıca, tarayıcıdan https://<app-name>.scm.azurewebsites.net/api/logs/docker
adresine giderek günlük dosyalarını inceleyebilirsiniz.
Günlük akışını dilediğiniz zaman durdurmak için Ctrl
+C
yazın.
Kapsayıcının içinden oluşturulan konsol günlüklerine erişebilirsiniz.
İlk olarak, aşağıdaki komutu çalıştırarak kapsayıcı günlüğünü açın:
az webapp log config --name <app-name> --resource-group <resource-group-name> --docker-container-logging filesystem
ve <resource-group-name>
öğesini web uygulamanız için uygun adlarla değiştirin<app-name>
.
Kapsayıcı günlüğü açıldıktan sonra günlük akışını görmek için aşağıdaki komutu çalıştırın:
az webapp log tail --name <app-name> --resource-group <resource-group-name>
Konsol günlüklerini hemen görmüyorsanız, 30 saniye içinde yeniden kontrol edin.
Günlük akışını istediğiniz zaman durdurmak için Ctrl+C yazın.
Günlük dosyalarını tarayıcıdan https://<app-name>.scm.azurewebsites.net/api/logs/docker
da inceleyebilirsiniz.
Sorun giderme
Çalışan bir PHP uygulaması App Service'te farklı davrandığında veya hataları olduğunda aşağıdakileri deneyin:
- Günlük akışına erişin.
- Uygulamayı üretim modunda yerel olarak test edin. App Service uygulamanızı üretim modunda çalıştırdığından, projenizin yerel olarak üretim modunda beklendiği gibi çalıştığından emin olmanız gerekir. Örneğin:
- Composer.json dosyanıza bağlı olarak üretim modu (
require
vs. ) için farklı paketler yüklenebilir.require-dev
- Bazı web çerçeveleri üretim modunda statik dosyaları farklı şekilde dağıtabilir.
- Bazı web çerçeveleri üretim modunda çalışırken özel başlangıç betikleri kullanabilir.
- Composer.json dosyanıza bağlı olarak üretim modu (
- Uygulamanızı App Service'te hata ayıklama modunda çalıştırın. Örneğin, Laravel'de uygulama ayarını olarak ayarlayarak uygulamanızı üretim ortamında hata ayıklama iletilerinin çıkışını
APP_DEBUG
almak üzeretrue
yapılandırabilirsiniz.
Günlüklerde robots933456
Kapsayıcı günlüklerinde şu iletiyi görebilirsiniz:
2019-04-08T14:07:56.641002476Z "-" - - [08/Apr/2019:14:07:56 +0000] "GET /robots933456.txt HTTP/1.1" 404 415 "-" "-"
Bu iletiyi güvenle yoksayabilirsiniz. /robots933456.txt
, App Service hizmetinin kapsayıcının istek sunmak için uygun olup olmadığını denetlemek için kullandığı işlevsiz bir URL'dir. 404 yanıtı, yolun var olmadığını belirtir ancak App Service bu sayede iyi ve isteklere yanıt vermeye uygun durumda olan kapsayıcıları belirler.
Sonraki adımlar
Veya ek kaynaklara bakın: