Ubuntu’da PHP 8.3 Kurulumu ve Sürüm Değiştirme
Sunucuda PHP sürümü yönetmek, her sistem yöneticisinin er ya da geç mutlaka uğraşmak zorunda kaldığı konulardan biri. Özellikle birden fazla proje yönetiyorsanız, bir proje PHP 7.4 isterken diğeri PHP 8.3 gerektiriyorsa işler karmaşıklaşabiliyor. Bu yazıda Ubuntu üzerinde PHP 8.3 kurulumunu, mevcut sürümlerle birlikte nasıl yöneteceğinizi ve projeye göre sürüm değiştirmeyi adım adım ele alacağız.
Neden PHP 8.3?
PHP 8.3, 2023 yılı Kasım ayında yayımlanan ve ciddi performans iyileştirmeleri getiren bir sürüm. Typed class constants, readonly özelliklerinin daha esnek kullanımı, json_validate() fonksiyonu ve çeşitli hata yönetimi geliştirmeleri bu sürümün öne çıkan yenilikleri arasında. JIT derleyicisinde de önemli optimizasyonlar yapılmış durumda.
Performans açısından bakıldığında PHP 8.3, aynı iş yükü altında PHP 7.4’e kıyasla %30-40 oranında daha hızlı çalışabiliyor. Bu sadece teorik bir rakam değil; production ortamında ölçtüğümüz gerçek sonuçlar da bu aralığı doğruluyor.
Ön Hazırlık
Ubuntu’nun kendi depolarında genellikle güncel PHP sürümleri bulunmaz. Ubuntu 22.04 LTS, varsayılan olarak PHP 8.1 sunarken Ubuntu 20.04 hala PHP 7.4 ile geliyor. PHP 8.3 için Ondrej Sury’nin PPA deposunu kullanmamız gerekiyor. Bu depo, PHP dünyasında yıllardan beri güvenilirliğini kanıtlamış bir kaynak.
Önce sisteminizi güncelleyin ve gerekli araçları yükleyin:
sudo apt update && sudo apt upgrade -y
sudo apt install -y software-properties-common apt-transport-https ca-certificates
Şimdi Ondrej PPA deposunu ekleyelim:
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
Bu adımdan sonra artık PHP 7.4’ten PHP 8.3’e kadar birden fazla sürümü aynı sisteme kurabilir ve aralarında geçiş yapabilirsiniz.
PHP 8.3 Kurulumu
Temel PHP 8.3 paketini ve yaygın kullanılan eklentileri kuralım:
sudo apt install -y php8.3 php8.3-cli php8.3-fpm php8.3-common
php8.3-mysql php8.3-pgsql php8.3-sqlite3
php8.3-curl php8.3-gd php8.3-mbstring
php8.3-xml php8.3-zip php8.3-bcmath
php8.3-intl php8.3-soap php8.3-redis
php8.3-opcache php8.3-imagick
Kurulum tamamlandıktan sonra sürümü doğrulayın:
php8.3 --version
Çıktı şuna benzeyecek:
PHP 8.3.2 (cli) (built: Jan 20 2024 14:15:30) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.2, Copyright (c) Zend Technologies
with Zend OPcache v8.3.2, Copyright (c), by Zend Technologies
PHP-FPM Servisini Başlatma
Web sunucusu olarak Nginx veya Apache kullanıyorsanız PHP-FPM servisini başlatmanız ve otomatik başlamasını etkinleştirmeniz gerekiyor:
sudo systemctl start php8.3-fpm
sudo systemctl enable php8.3-fpm
sudo systemctl status php8.3-fpm
FPM’nin çalıştığını doğrulamak için socket dosyasına bakabilirsiniz:
ls -la /run/php/php8.3-fpm.sock
CLI Üzerinde Sürüm Değiştirme
Sisteminizde birden fazla PHP sürümü kuruluysa, varsayılan CLI sürümünü update-alternatives komutuyla yönetebilirsiniz.
Mevcut PHP alternatiflerini listeleyelim:
sudo update-alternatives --list php
Eğer daha önce hiç yapılandırma yapmadıysanız bu komut hata verebilir. PHP sürümlerini alternatif sisteme kaydetmek için:
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.3 83
Buradaki son sayılar öncelik değerlerini temsil ediyor. Yüksek sayı, daha yüksek öncelik anlamına geliyor.
Şimdi interaktif olarak sürüm seçelim:
sudo update-alternatives --config php
Bu komut size şuna benzer bir ekran gösterecek:
There are 3 choices for the alternative php (providing /usr/bin/php).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/php8.3 83 auto mode
1 /usr/bin/php7.4 74 manual mode
2 /usr/bin/php8.1 81 manual mode
3 /usr/bin/php8.3 83 manual mode
Press <enter> to keep the current choice[*], or type selection number:
PHP 8.3’ü seçmek için 3 yazıp Enter’a basın. Seçimi doğrulayın:
php --version
update-alternatives ile Birden Fazla Binary Yönetimi
Sadece php değil, php-config, phpize ve phar gibi araçlar için de aynı işlemi yapmanız gerekebilir:
sudo update-alternatives --install /usr/bin/php-config php-config /usr/bin/php-config8.3 83
sudo update-alternatives --install /usr/bin/phpize phpize /usr/bin/phpize8.3 83
sudo update-alternatives --config php-config
sudo update-alternatives --config phpize
Apache ile PHP Sürüm Değiştirme
Apache kullanıyorsanız mod_php üzerinden sürüm değişikliği yapmak biraz farklı işliyor. Önce mevcut durumu görelim:
apache2ctl -M | grep php
PHP 8.1’den PHP 8.3’e geçmek için önce eski modülü devre dışı bırakın, sonra yenisini etkinleştirin:
sudo a2dismod php8.1
sudo a2enmod php8.3
sudo systemctl restart apache2
Apache ile PHP-FPM kullanıyorsanız, ki bu production için önerilen yöntemdir, virtual host yapılandırmanızda FPM socket’ını güncellemeniz gerekiyor:
sudo nano /etc/apache2/sites-available/siteniz.conf
Yapılandırma dosyasında şunu arayın ve güncelleyin:
<VirtualHost *:80>
ServerName siteniz.com
DocumentRoot /var/www/siteniz
<FilesMatch .php$>
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>
</VirtualHost>
Değişikliği uygulayın:
sudo a2enmod proxy_fcgi setenvif
sudo systemctl restart apache2
Nginx ile PHP Sürüm Değiştirme
Nginx için sürüm değişikliği daha basit. Virtual host yapılandırma dosyanızı açın:
sudo nano /etc/nginx/sites-available/siteniz.conf
fastcgi_pass veya proxy_pass satırını güncelleyin:
server {
listen 80;
server_name siteniz.com;
root /var/www/siteniz;
index index.php;
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Nginx konfigürasyonunu test edip yeniden başlatın:
sudo nginx -t
sudo systemctl reload nginx
Gerçek Dünya Senaryosu: Çoklu Site Yönetimi
Diyelim ki aynı sunucuda iki farklı projeniz var. eski-proje.com PHP 7.4 gerektiriyor, yeni-proje.com ise PHP 8.3 istiyor. Nginx üzerinde her iki projeyi de aynı anda nasıl çalıştırabileceğinizi görelim.
Önce her iki PHP-FPM servisinin çalıştığından emin olun:
sudo systemctl start php7.4-fpm php8.3-fpm
sudo systemctl enable php7.4-fpm php8.3-fpm
eski-proje.com için Nginx yapılandırması:
server {
listen 80;
server_name eski-proje.com;
root /var/www/eski-proje;
index index.php;
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
access_log /var/log/nginx/eski-proje-access.log;
error_log /var/log/nginx/eski-proje-error.log;
}
yeni-proje.com için Nginx yapılandırması:
server {
listen 80;
server_name yeni-proje.com;
root /var/www/yeni-proje;
index index.php;
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
access_log /var/log/nginx/yeni-proje-access.log;
error_log /var/log/nginx/yeni-proje-error.log;
}
Symlink oluşturun ve Nginx’i yeniden yükleyin:
sudo ln -s /etc/nginx/sites-available/eski-proje.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/yeni-proje.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Bu yapılandırmayla her iki site de kendi PHP versiyonuyla bağımsız şekilde çalışmaya devam eder.
PHP 8.3 Yapılandırması
Kurulumdan sonra php.ini dosyasını ihtiyaçlarınıza göre düzenlemek isteyeceksiniz. PHP 8.3 için yapılandırma dosyaları şu konumlarda:
- CLI için:
/etc/php/8.3/cli/php.ini - FPM için:
/etc/php/8.3/fpm/php.ini - Apache modülü için:
/etc/php/8.3/apache2/php.ini
Production ortamı için önerilen temel ayarlar:
sudo nano /etc/php/8.3/fpm/php.ini
Dosyada şu değerleri güncelleyin:
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
max_input_vars = 3000
date.timezone = Europe/Istanbul
expose_php = Off
display_errors = Off
log_errors = On
error_log = /var/log/php8.3-errors.log
opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 2
Değişiklikler sonrası FPM’yi yeniden başlatın:
sudo systemctl restart php8.3-fpm
PHP-FPM Pool Yapılandırması
Production ortamlarında varsayılan FPM pool yapılandırması genellikle yeterli olmaz. Pool ayarlarını düzenleyelim:
sudo nano /etc/php/8.3/fpm/pool.d/www.conf
Yüksek trafikli bir site için şu değerleri deneyin:
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
pm.process_idle_timeout = 10s
Bu değerler sunucunuzun RAM kapasitesine göre değişmeli. Kaba bir hesap için: pm.max_children = (Toplam RAM - OS ve diğer servisler için ayrılan RAM) / Ortalama PHP süreç boyutu formülünü kullanabilirsiniz. 4 GB RAM’li bir sunucuda, her PHP sürecinin yaklaşık 50 MB kapladığını varsayarsak, pm.max_children = 50 makul bir başlangıç noktası.
Composer ile PHP Sürümü Belirleme
Birden fazla PHP sürümü olan sistemde Composer’ı belirli bir PHP sürümüyle çalıştırmak isteyebilirsiniz:
php8.3 /usr/local/bin/composer install
php8.3 /usr/local/bin/composer update
Ya da Composer’ın her zaman PHP 8.3 kullanmasını istiyorsanız, shell alias ekleyebilirsiniz:
echo 'alias composer="php8.3 /usr/local/bin/composer"' >> ~/.bashrc
source ~/.bashrc
Kurulu Eklentileri Kontrol Etme
Hangi eklentilerin yüklü olduğunu görmek için:
php8.3 -m
Belirli bir eklentinin yüklü olup olmadığını kontrol etmek için:
php8.3 -m | grep -i redis
php8.3 -m | grep -i opcache
Eksik bir eklenti varsa kurabilirsiniz:
sudo apt install php8.3-redis php8.3-imagick
sudo systemctl restart php8.3-fpm
Sürüm Değiştirme Sonrası Kontroller
PHP sürümünü değiştirdikten sonra uygulamanızın düzgün çalışıp çalışmadığını doğrulamak için birkaç kontrol yapmanız iyi olur.
Web üzerinden PHP sürümünü kontrol etmek için geçici bir info.php dosyası oluşturun (production’da güvenlik riski oluşturduğu için işiniz bitince silin):
echo "<?php phpinfo();" | sudo tee /var/www/siteniz/info.php
Tarayıcıdan http://siteniz.com/info.php adresine gidin ve PHP sürümünü doğrulayın. İşiniz bitince dosyayı silin:
sudo rm /var/www/siteniz/info.php
Uygulama loglarını takip edin:
sudo tail -f /var/log/nginx/siteniz-error.log
sudo tail -f /var/log/php8.3-errors.log
Eski PHP Sürümlerini Kaldırma
Artık ihtiyaç duymadığınız PHP sürümlerini sistemden tamamen kaldırabilirsiniz. Ancak bunu yapmadan önce hiçbir sitenin veya uygulamanın o sürüme bağımlı olmadığından emin olun.
sudo apt purge php7.4 php7.4-* -y
sudo apt autoremove -y
Eğer update-alternatives’a kayıtlıysa oradan da temizleyin:
sudo update-alternatives --remove php /usr/bin/php7.4
Sık Karşılaşılan Sorunlar ve Çözümleri
FPM socket bulunamıyor hatası: Nginx veya Apache “connect() to unix:/run/php/php8.3-fpm.sock failed” hatası veriyorsa FPM servisinin çalışıp çalışmadığını kontrol edin:
sudo systemctl status php8.3-fpm
sudo journalctl -u php8.3-fpm -n 50
Eklenti yüklenmedi hatası: Yeni bir eklenti kurduğunuzda FPM’yi yeniden başlatmayı unutmayın. Eklentiler FPM başlarken yüklenir.
OPcache eski kodu önbellekliyor: PHP dosyalarında değişiklik yaptıktan sonra OPcache’in eski kodu sunması durumunda:
sudo systemctl restart php8.3-fpm
Ya da PHP üzerinden cache’i temizleyebilirsiniz (Laravel, WordPress gibi framework’lerin buna özel araçları var).
update-alternatives çakışması: Birden fazla PPA eklediyseniz veya manuel kurulum yaptıysanız alternatifler arasında çakışma olabilir. --config parametresiyle manuel seçim yapın ve --display ile mevcut durumu inceleyin:
sudo update-alternatives --display php
Sonuç
Ubuntu üzerinde PHP 8.3 kurulumu ve sürüm yönetimi, doğru araçları ve yöntemi bildiğinizde oldukça yönetilebilir bir süreç haline geliyor. Ondrej PPA deposu sayesinde birden fazla PHP sürümünü aynı anda çalıştırabilir, her projenizi kendi PHP sürümüyle izole edebilirsiniz.
Önemli noktaları özetlemek gerekirse: CLI sürümü için update-alternatives kullanın, web sunucusu sürümü için PHP-FPM socket’larını yapılandırın. Çoklu proje senaryolarında her sitenin kendi FPM pool’u olması hem güvenlik hem de performans açısından avantaj sağlar. Production geçişlerinden önce staging ortamında test etmeyi, uygulama loglarını yakından takip etmeyi ve phpinfo() dosyalarını kullandıktan hemen sonra silmeyi alışkanlık haline getirin.
PHP 8.3’ün getirdiği performans iyileştirmeleri ve yeni özellikler düşünüldüğünde, desteklenen projelerinizi bu sürüme taşımak uzun vadede işe yarayacaktır. Eski projeleri yavaşça modernize ederken yeni projeleri direkt PHP 8.3 üzerinde başlatmak dengeli bir geçiş stratejisi olarak değerlendirilebilir.
