0Pricing
PHP Academy · Ders

PHP Uygulamasını Kapsayıcılaştırma

Üretime hazır bir PHP Dockerfile'ı yazın.

PHP Uygulamasını Kapsayıcılaştırma, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.

PHP'yi Neden Kapsayıcılaştırmalı

PHP'yi tekrarlanabilir biçimde dağıtmak; tam yorumlayıcı sürümünü, uzantıları ve işletim sistemi kitaplıklarını kodunuzla birlikte sabitlemek anlamına gelir. Bir Docker imajı her ortama — dizüstü bilgisayar, CI, üretim — aynı php -v çıktısını ve aynı ext-* kümesini sağlar.

Bu derste üretime hazır bir imaj oluşturacağız: PHP-FPM, yalnızca ihtiyaç duyduğunuz uzantılar, ayarlanmış yapılandırmalar, kök olmayan bir kullanıcı ve bir sağlık denetimi.

FPM ve Apache Tabanı

Resmî PHP imajları farklı çeşitlerde sunulur. nginx/traefik arkasındaki üretim web uygulaması için php:8.3-fpm-alpine (küçük) veya php:8.3-fpm (Debian, glibc — yerel kitaplıklarla daha az sürpriz) tercih edin.

  • cli — çalışanlar, kuyruklar, zamanlanmış görevler
  • fpm — FastCGI süreç yöneticisi, nginx ile birlikte kullanılır
  • apache — yerleşik Apache, kullanışlıdır ancak daha ağırdır

Alt sürümü sabitleyin. Üretimde asla :latest kullanmayın.

# Base image choice in your Dockerfile
FROM php:8.3-fpm-alpine AS base

# Why alpine? ~30MB base vs ~140MB Debian.
# Tradeoff: musl libc, occasional native-extension friction.

Uzantıları Yükleme

Bu imajların içinde asla apt install php-xxx kullanmayın — birlikte gelen docker-php-ext-install, docker-php-ext-configure ve pecl yardımcılarını kullanın. install-php-extensions betiği (mlocati), gerekli geliştirme başlıklarını sizin için getiren fiilî kısayoldur.

FROM php:8.3-fpm-alpine

# Grab the helper that resolves build deps automatically
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

RUN chmod +x /usr/local/bin/install-php-extensions && \
    install-php-extensions \
        pdo_mysql \
        opcache \
        intl \
        zip \
        redis \
        bcmath

İmajda Composer

Bir yükleyiciyi curl ile indirmek yerine Composer ikilisini resmî imajından kopyalayın. Üretim için composer install komutunu --no-dev ve --optimize-autoloader seçenekleriyle çalıştırın; bağımlılık katmanının kaynak değişikliklerinden bağımsız olarak önbelleğe alınabilmesi için önce yalnızca composer.json/composer.lock dosyalarını kopyalayın.

COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

WORKDIR /app

# Cache-friendly: deps layer invalidates only when lock changes
COPY composer.json composer.lock ./
RUN composer install \
        --no-dev \
        --no-scripts \
        --no-autoloader \
        --prefer-dist

COPY . .
RUN composer dump-autoload --optimize --classmap-authoritative

php.ini'yi Ayarlama

Temel imaj, php.ini-production ve php.ini-development şablonlarıyla birlikte gelir. Üretim şablonunu etkinleştirin, ardından kendi geçersiz kılma ayarlarınızı conf.d içine bırakın — bu dizin en son birleştirildiği için öncelik kazanır.

Temel üretim değerleri: opcache.enable=1, opcache.validate_timestamps=0 (imajdaki kod değişmezdir) ve makul bir memory_limit.

# Activate production ini
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"

# Custom overrides win because conf.d loads last
COPY docker/php/zz-app.ini $PHP_INI_DIR/conf.d/zz-app.ini

OPcache Geçersiz Kılma Dosyası

Bu, üretimdeki en büyük kazanımı sağlar. validate_timestamps=0 ile PHP her istekte dosyaların durum bilgilerini sorgulamaz — ancak bu, değişiklikleri dağıtmak için imajı yeniden oluşturmanız MUST anlamına gelir (değişmez kapsayıcılar için tam olarak istediğimiz şey budur).

; docker/php/zz-app.ini
memory_limit = 256M
expose_php = Off

opcache.enable = 1
opcache.enable_cli = 0
opcache.memory_consumption = 256
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 20000
opcache.validate_timestamps = 0
opcache.preload = /app/preload.php
opcache.preload_user = www-data

Kök Olmayan Kullanıcıyla Çalıştırma

İmajda zaten www-data tanımlıdır. FPM'yi kök olarak çalıştırmak saldırı yüzeyini gereksiz yere artırır. Yazılabilir yolların (önbellek, günlükler) sahipliğini ayarlayın ve CMD komutundan önce USER ile kullanıcıyı değiştirin.

FPM'nin ana süreci yine ayrıcalıklı bağlantı noktalarına mı bağlanıyor? Hayır — FPM, 9000 numaralı bağlantı noktasını (ayrıcalıksız) dinler; bu nedenle kök olmayan kullanıcıyla çalıştırmak kolaydır.

# Make runtime-writable dirs owned by the runtime user
RUN chown -R www-data:www-data /app/var /app/storage 2>/dev/null || true

USER www-data

EXPOSE 9000
CMD ["php-fpm"]

Sağlık Denetimleri

Orkestratörlerin yalnızca sürecin var olduğunu değil, FPM'nin gerçekten çalışır durumda olduğunu gösteren bir sinyale ihtiyacı vardır. cgi-fcgi, FPM'nin /status veya /ping uç noktasına ping gönderebilir. Önce FPM havuzunda pm.status_path ve ping.path değerlerini etkinleştirin.

# In www.conf pool config:
;   ping.path = /ping
;   ping.response = pong

# Dockerfile HEALTHCHECK using cgi-fcgi
RUN install-php-extensions @composer >/dev/null 2>&1 || true

HEALTHCHECK --interval=10s --timeout=3s --retries=3 \
  CMD SCRIPT_NAME=/ping SCRIPT_FILENAME=/ping REQUEST_METHOD=GET \
      cgi-fcgi -bind -connect 127.0.0.1:9000 || exit 1

Dockerfile'ı Oluşturma

İşte tutarlı, tek aşamalı bir üretim Dockerfile'ı. Bir sonraki derste bunu derleme araçlarını çıkarmak için çok aşamalı hâle getireceğiz. Sıralamaya dikkat edin: bağımlılıklar → yapılandırma → kaynak kodu → otomatik yükleme → kullanıcı değişimi.

FROM php:8.3-fpm-alpine

ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions && \
    install-php-extensions pdo_mysql opcache intl zip redis

COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /app

RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
COPY docker/php/zz-app.ini $PHP_INI_DIR/conf.d/

COPY composer.json composer.lock ./
RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist
COPY . .
RUN composer dump-autoload --optimize --classmap-authoritative && \
    chown -R www-data:www-data /app/var

USER www-data
EXPOSE 9000
CMD ["php-fpm"]

Derlemeyi Doğrulama

Derlemeden sonra imaja gerçekten nelerin eklendiğini hızlıca doğrulayın: PHP sürümü, yüklenen uzantılar ve OPcache doğrulamasının kapalı olması. Kısa bir CLI betiği, uygulamanızın dayandığı çalışma zamanı sözleşmesini doğrular.

<?php
// Run inside the container: php verify.php
echo 'PHP ' . PHP_VERSION . PHP_EOL;

$required = ['pdo_mysql', 'opcache', 'intl', 'zip'];
foreach ($required as $ext) {
    printf("%-12s %s\n", $ext, extension_loaded($ext) ? 'OK' : 'MISSING');
}

var_dump((bool) ini_get('opcache.enable'));
?>

Derleme Bağlamı Temizliği

Bir .dockerignore derleme bağlamınızı küçük tutar, gizli bilgilerin ve bağımlılık dizini şişkinliğinin imaja sızmasını ve önbelleği bozmasını önler. vendor, VCS, env dosyaları ve yerel araçları dışarıda bırakın.

# .dockerignore
.git
.gitignore
vendor/
node_modules/
.env
.env.*
tests/
*.md
docker-compose*.yml
storage/logs/*
var/cache/*

Hızlı Kontrol

Üretim imajında opcache.validate_timestamps=0 neden ayarlanır?

Özet

Üretime yönelik bir PHP-FPM imajı oluşturdunuz: sürümü sabitlenmiş 8.3-fpm-alpine temel imajı kullandınız, yalnızca gereken uzantıları yükleyici betiğiyle kurdunuz, Composer'ı ve önbelleğe alınmış bağımlılıkları kendi katmanlarına kopyaladınız, OPcache geçersiz kılmasını içeren üretim php.ini dosyasını etkinleştirdiniz, www-data kullanıcısına geçtiniz ve bir FPM sağlık denetimi eklediniz.

Temel alışkanlıklar: sürümleri sabitleyin, bağımlılık katmanını önbelleğe alın, kök olmayan kullanıcıyla çalıştırın, zaman damgası doğrulamasını devre dışı bırakın ve .dockerignore ile derleme bağlamını yalın tutun.

Sıkça Sorulan Sorular

“PHP Uygulamasını Kapsayıcılaştırma” dersi ücretsiz mi?

Evet — “PHP Uygulamasını Kapsayıcılaştırma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.

“PHP Uygulamasını Kapsayıcılaştırma” dersinde ne öğreneceğim?

Üretime hazır bir PHP Dockerfile'ı yazın. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

PHP Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“PHP Uygulamasını Kapsayıcılaştırma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. PHP Uygulamasını Kapsayıcılaştırma
  2. Çok Aşamalı Derlemeler ve İyileştirme
  3. Yerel Yığınlar için Docker Compose
  4. GitHub Actions ile CI/CD
← PHP Academy Sayfasına Dön