update-alternatives ile PHP Sürümü Değiştirme
Birden fazla PHP sürümü kurulu olan bir sunucuda “hangi PHP çalışıyor?” sorusu sysadmin’lerin korkulu rüyası haline gelir. Özellikle legacy bir uygulama PHP 7.4 isterken yeni microservice’in PHP 8.2 üzerinde koşması gerektiğinde işler karmaşıklaşmaya başlar. İşte tam bu noktada update-alternatives komutu devreye girer ve hayatı ciddi ölçüde kolaylaştırır.
update-alternatives Nedir ve Neden PHP Yönetiminde Kullanılır?
update-alternatives, Debian tabanlı sistemlerde (Ubuntu, Debian, Linux Mint vb.) aynı işlevi gören birden fazla yazılımın sistemde bir arada bulunmasını yöneten bir mekanizmadır. Temel çalışma prensibi sembolik link (symlink) yönetimine dayanır. Siz /usr/bin/php gibi genel bir yol kullanırken, sistem arkada bu yolu doğru PHP binary’sine işaret etmek için symlink’leri günceller.
PHP söz konusu olduğunda bu mekanizma hayat kurtarır. Diyelim ki sisteminizde PHP 7.4, 8.1 ve 8.2 kurulu. Her birinin binary dosyası /usr/bin/php7.4, /usr/bin/php8.1 ve /usr/bin/php8.2 altında duruyor. update-alternatives olmadan bu sürümler arasında geçiş yapmak için ya her seferinde tam path yazmak, ya da symlink’leri elle yönetmek zorunda kalırsınız. Her iki yöntem de hatalara açık ve yorucu.
Sistemde Mevcut PHP Sürümlerini Kontrol Etme
Önce elimizde ne var, bir bakalım. Sisteme kurulu PHP sürümlerini listelemek için:
ls /usr/bin/php*
Bu komut çıktısı genellikle şöyle görünür:
/usr/bin/php
/usr/bin/php7.4
/usr/bin/php8.1
/usr/bin/php8.2
Şu an hangi PHP sürümünün aktif olduğunu görmek için:
php --version
update-alternatives sisteminde PHP için kayıtlı tüm alternatifleri listelemek istiyorsanız:
update-alternatives --list php
Eğer henüz hiçbir alternatif eklenmemişse bu komut hata verir veya boş döner. Bu durumda önce alternatifleri kaydetmeniz gerekir.
PHP Sürümlerini Alternatiflere Kaydetme
Sistemde PHP 7.4, 8.1 ve 8.2 kurulu olduğunu varsayalım. Bunları update-alternatives sistemine kaydetmek için --install parametresini kullanıyoruz. Buradaki öncelik (priority) sayısı önemli: daha yüksek sayı, otomatik mod seçildiğinde tercih edilen sürümü belirler.
sudo update-alternatives --install /usr/bin/php php /usr/bin/php7.4 74
sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.1 81
sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.2 82
Komut söz dizimini açıklayalım:
- –install: Yeni bir alternatif ekler
- /usr/bin/php: Oluşturulacak sembolik linkin yolu (genel link)
- php: Alternatif grubunun adı
- /usr/bin/php7.4: Gerçek binary dosyasının yolu
- 74: Öncelik değeri (priority)
Bu komutu çalıştırdıktan sonra /usr/bin/php artık en yüksek öncelikli sürüme, yani PHP 8.2’ye işaret eder.
Aktif PHP Sürümünü Değiştirme
Kayıtlı alternatifler arasında geçiş yapmanın iki yolu var: interaktif mod ve direkt seçim.
İnteraktif Mod ile Sürüm Seçimi
sudo update-alternatives --config php
Bu komutu çalıştırdığınızda şuna benzer bir ekran gelir:
There are 3 choices for the alternative php (providing /usr/bin/php).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/php8.2 82 auto mode
1 /usr/bin/php7.4 74 manual mode
2 /usr/bin/php8.1 81 manual mode
3 /usr/bin/php8.2 82 manual mode
Press <enter> to keep the current choice[*], or type selection number:
Buradan istediğiniz sürümün numarasını yazıp Enter’a basmanız yeterli. Örneğin PHP 7.4’e geçmek için 1 yazarsınız.
Direkt Komutla Sürüm Seçimi
Otomasyon script’lerinde veya interaktif olmayan ortamlarda direkt seçim çok daha kullanışlı:
sudo update-alternatives --set php /usr/bin/php7.4
Değişikliği doğrulamak için:
php --version
Çıktı artık PHP 7.4 bilgilerini gösterecektir.
PHP CLI ile PHP-FPM’i Birlikte Yönetme
Burada kritik bir noktaya dikkat çekmek gerekiyor: php komutu için alternatif ayarlamak sadece CLI (komut satırı) sürümünü etkiler. Web sunucunuzun kullandığı PHP-FPM servisi ayrı bir bileşendir ve ayrı yönetilmesi gerekir.
PHP-FPM Alternatifleri Kaydetme
PHP-FPM için de benzer bir yapı kurabilirsiniz:
sudo update-alternatives --install /usr/sbin/php-fpm php-fpm /usr/sbin/php-fpm7.4 74
sudo update-alternatives --install /usr/sbin/php-fpm php-fpm /usr/sbin/php-fpm8.1 81
sudo update-alternatives --install /usr/sbin/php-fpm php-fpm /usr/sbin/php-fpm8.2 82
Ancak pratikte PHP-FPM yönetimi biraz farklı işler. Nginx veya Apache ile birlikte kullanıldığında her PHP-FPM sürümü kendi socket veya port’u üzerinden çalışır. Bu durumda birden fazla FPM sürümünü aynı anda çalıştırıp, hangi virtual host’un hangi FPM sürümünü kullanacağını web sunucusu konfigürasyonunda belirtmeniz daha pratik bir yaklaşımdır.
Nginx ile Çoklu PHP-FPM Kullanımı
Örneğin Nginx konfigürasyonunda iki farklı sitenin iki farklı PHP sürümü kullanmasını şöyle sağlarsınız:
# Eski uygulama - PHP 7.4
server {
listen 80;
server_name legacy-app.example.com;
root /var/www/legacy-app;
location ~ .php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
# Yeni uygulama - PHP 8.2
server {
listen 80;
server_name new-app.example.com;
root /var/www/new-app;
location ~ .php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Bu yapıda update-alternatives ile PHP CLI sürümünü değiştirmeniz web uygulamalarını etkilemez; sadece terminalde php komutunu çalıştırdığınızda hangi sürümün devreye gireceğini belirler.
phpize ve php-config Alternatiflerini de Yönetme
Sadece php binary’si yeterli değil. Eğer PHP extension’ları derliyorsanız phpize ve php-config araçlarını da yönetmeniz gerekir:
sudo update-alternatives --install /usr/bin/phpize phpize /usr/bin/phpize7.4 74
sudo update-alternatives --install /usr/bin/phpize phpize /usr/bin/phpize8.1 81
sudo update-alternatives --install /usr/bin/phpize phpize /usr/bin/phpize8.2 82
sudo update-alternatives --install /usr/bin/php-config php-config /usr/bin/php-config7.4 74
sudo update-alternatives --install /usr/bin/php-config php-config /usr/bin/php-config8.1 81
sudo update-alternatives --install /usr/bin/php-config php-config /usr/bin/php-config8.2 82
Composer gibi araçlar PHP CLI’yi kullandığından, CLI sürümünü değiştirdiğinizde Composer da o sürümle çalışmaya başlar. Bu bazen beklenmeyen bağımlılık sorunlarına yol açabilir; dikkatli olun.
Gerçek Dünya Senaryosu: Deployment Script’inde Sürüm Yönetimi
Diyelim ki bir CI/CD pipeline’ınız var ve farklı branch’ler farklı PHP sürümleri gerektiriyor. Aşağıdaki gibi basit bir deployment script’i işinizi görebilir:
#!/bin/bash
APP_NAME=$1
PHP_VERSION=$2
if [ -z "$APP_NAME" ] || [ -z "$PHP_VERSION" ]; then
echo "Kullanim: $0 <uygulama-adi> <php-surumu>"
echo "Ornek: $0 myapp 8.2"
exit 1
fi
PHP_BINARY="/usr/bin/php${PHP_VERSION}"
if [ ! -f "$PHP_BINARY" ]; then
echo "HATA: PHP ${PHP_VERSION} bulunamadi: ${PHP_BINARY}"
exit 1
fi
echo "PHP ${PHP_VERSION} aktif ediliyor..."
sudo update-alternatives --set php "$PHP_BINARY"
CURRENT_VERSION=$(php --version | head -n1)
echo "Aktif PHP: ${CURRENT_VERSION}"
echo "${APP_NAME} icin deployment basliyor..."
cd /var/www/${APP_NAME}
composer install --no-dev --optimize-autoloader
echo "Deployment tamamlandi."
Bu script’i şöyle çalıştırırsınız:
chmod +x deploy.sh
./deploy.sh myapp 8.2
Alternatif Kaldırma ve Temizlik
Sistemden bir PHP sürümü kaldırdığınızda veya alternatifler listesini temizlemek istediğinizde --remove parametresini kullanın:
sudo update-alternatives --remove php /usr/bin/php7.4
Bir gruba ait tüm alternatifleri ve konfigürasyonu tamamen silmek isterseniz:
sudo update-alternatives --remove-all php
Ancak bunu yaptıktan sonra /usr/bin/php symlink’i silinir ve php komutu çalışmaz hale gelir. Temizliğin ardından kalan sürümleri tekrar kaydetmeniz gerekir.
Alternatiflerin Durumunu İzleme ve Debug
Bir şeyler ters gittiğinde veya mevcut durumu anlamak istediğinizde --display parametresi çok işe yarar:
update-alternatives --display php
Bu komut şuna benzer detaylı bir çıktı verir:
php - auto mode
link best version is /usr/bin/php8.2
link currently points to /usr/bin/php8.2
link php is /usr/bin/php
/usr/bin/php7.4 - priority 74
/usr/bin/php8.1 - priority 81
/usr/bin/php8.2 - priority 82
Burada dikkat edilmesi gereken iki kavram var: auto mode ve manual mode. Auto mode’da sistem en yüksek öncelikli sürümü seçer. --set ile bir sürüm belirlediğinizde manual mode’a geçilir ve öncelik değerleri artık bir önemi kalmaz; siz o sürüm değiştirene kadar seçiminiz sabit kalır.
Eğer tekrar auto mode’a dönmek istiyorsanız:
sudo update-alternatives --auto php
Sık Yapılan Hatalar ve Çözümleri
Yanlış binary yolu girmek: --install komutunda gerçek binary dosyasının var olup olmadığını her zaman kontrol edin. Yanlış bir yol girdiğinizde symlink oluşur ama çalışmaz.
# Önce binary'nin var olduğunu doğrulayın
ls -la /usr/bin/php8.2
which php8.2
PHP-FPM socket izin sorunları: Nginx veya Apache www-data kullanıcısıyla çalışırken PHP-FPM socket dosyasına erişim izni olmayabilir. FPM pool konfigürasyonunda socket izinlerini kontrol edin:
# FPM pool konfigürasyonunu düzenleyin
sudo nano /etc/php/8.2/fpm/pool.d/www.conf
# listen.owner = www-data
# listen.group = www-data
# listen.mode = 0660
Composer sürüm uyumsuzluğu: PHP CLI sürümünü değiştirdikten sonra Composer’ın hata verdiğini görürseniz, composer.json içindeki platform konfigürasyonunu güncellemeniz gerekebilir.
Ubuntu/Debian için Hızlı Kurulum ve Yapılandırma Özeti
Temiz bir sistemde sıfırdan başlayıp birden fazla PHP sürümü kurmak ve update-alternatives ile yönetmek için gereken adımların tamamını bir arada görelim:
# Ondrej PPA ekle (birden fazla PHP sürümü için gerekli)
sudo add-apt-repository ppa:ondrej/php
sudo apt update
# İstenen PHP sürümlerini kur
sudo apt install php7.4 php7.4-cli php7.4-fpm
sudo apt install php8.1 php8.1-cli php8.1-fpm
sudo apt install php8.2 php8.2-cli php8.2-fpm
# Alternatifleri kaydet
sudo update-alternatives --install /usr/bin/php php /usr/bin/php7.4 74
sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.1 81
sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.2 82
# Durumu kontrol et
update-alternatives --display php
# İstenen sürüme geç
sudo update-alternatives --config php
# Doğrula
php --version
FPM servislerini başlatmayı unutmayın:
sudo systemctl enable --now php7.4-fpm
sudo systemctl enable --now php8.1-fpm
sudo systemctl enable --now php8.2-fpm
# Tüm FPM servislerinin çalıştığını kontrol et
sudo systemctl status php7.4-fpm php8.1-fpm php8.2-fpm
Sonuç
update-alternatives, birden fazla PHP sürümü barındıran sistemlerde düzen ve kontrol sağlamanın en temiz yoludur. Sembolik link yönetimini elle yapmak yerine bu aracı kullanmak hem hata riskini azaltır hem de sürümler arası geçişi tek komuta indirir.
Pratikte şunu aklınızda tutun: update-alternatives ile yaptığınız değişiklikler sadece php CLI komutunu etkiler. Web uygulamalarınızın kullandığı PHP-FPM servisleri bağımsız çalışır ve ayrıca yönetilmesi gerekir. Bu ayrımı kavradığınızda, hem geliştirme ortamında hem de production sunucularda PHP sürüm yönetimi çok daha öngörülü ve kontrol edilebilir hale gelir.
Birden fazla müşterinin uygulamasını barındıran paylaşımlı ortamlarda veya farklı projeler üzerinde çalışan geliştirme sunucularında bu yapıyı kurmak, ileride yaşanabilecek “neden birinin sitesi bozuldu?” krizlerinin önüne geçer. Zaman ayırıp sistemi doğru kurmak, gece yarısı telefon almamak anlamına gelir; bu da her sysadmin için değerinin ölçülmesi güç bir kazanım.
