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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir