ReflectionClass ile yorum satırlarını okuma

ReflectionClass ile kodunuz çalışırken(runtime) yorum satırlarını okuyabilirsiniz.

Örneğin aşağıdaki gibi bir class’ınız olduğunu varsayalım.

/**
 * Class User
 */
class User
{
    /**
     * @var string
     */
    protected $name;

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }
}

Öncelikle ReflectionClass’tan bir obje üretiyoruz ve istediğimiz class’ın adını constructor’dan veriyoruz.

$userReflectionClass = new ReflectionClass('User');
// veya
$userReflectionClass = new ReflectionClass(User::class);

Class’ın yorum satırına erişmek

var_dump($userReflectionClass->getDocComment());

Ekran çıktısı:

string(23) "/**
     * Class User
     */"

Property’nin yorum satırına erişmek

var_dump($userReflectionClass->getProperty('name')->getDocComment());

Ekran çıktısı:

string(32) "/**
     * @var string
     */"

Method’un yorum satırına erişmek

var_dump($userReflectionClass->getMethod('getName')->getDocComment());

Ekran çıktısı:

string(35) "/**
     * @return string
     */"

ReflectionClass ile constant, interface, trait vb. bir çok özelliğe erişebilirsiniz. Tüm özellikler için php dokümanına bakabilirsiniz.

Docker Container’ın İstediğiniz Kullanıcıyla Dosya Oluşturması

Docker’ı admin kullanıcısı ile yönettiğinizi ve php-fpm image’ını kullandığınızı varsayalım.

Host’unuzdaki /home/admin/www klasörü container’ınızın /var/www/project klasörüne mount edilmiş.

  1. Docker exec komutu ile container’ın içinden bir dosya oluşturduğunuzda bu dosyanın sahibi root kullanıcısı olacaktır.
  2. Sitenize webden bir dosya upload ettiğinizde bu dosyanın sahibi www-data olacaktır.
  3. Docker dışından admin kullanıcısı ile www klasörüne bir dosya oluşturduğunuzda bu dosyanın sahibi admin kullanıcısı olacaktır.

Bir önceki yazımdaki çözümü uyguladığınızda 1. ve 2. işlemler www-data kullanıcısını kullanıp oluşturdukları dosyalara erişebileceklerdir fakat 3. aşamadaki işlem ile oluşturulmuş dosyalara erişemeyeceklerdir.

Unix/Linux dosyaların sahibinin kullanıcı adını ve grubunun adını değil kullanıcısının ve grubunun id’lerini tutar.

Örneğin www-data kullanıcısının oluşturduğu dosyanın uid’si 33, admin kullanıcısının oluşturduğu dosyanın uid’si 1000 olacaktır. Genellikle aynı id’ler ile gruplar da oluşturulur. www-data(33) user’ı www-data(33) group’u gibi.

Bu durumda eğer container’ın www-data kullanıcısının id’sini 33 yerine 1000 yaparsak, 3 işlemde de dosyalar 1000 id’si ile oluşturulacaktır. uid ve gid değeri 1000 olan bir dosyanın sahibine docker dışından baktığımızda admin, container’ı içinden baktığımızda ise www-data gözükecektir. İsimleri farklı olsa da id’ler aynı olduğu için dosya izni sorunları olmayacaktır.

Çözüm

Host söylemediği sürece Container’lar host’un uid ve gid bilgisine erişemez. Container’a build aşamasında kullanabilmesi için argument olarak uid ve gid değerlerini verebiliriz.

  1. Dockerfile’a aşağıdaki satırları ekleyin.
ARG HOST_UID
ARG HOST_GID
ENV HOST_UID $HOST_UID
ENV HOST_GID $HOST_GID
RUN sed -ri 's#^www-data:x:33:33:www-data:/var/www:#www-data:x:'"$HOST_UID"':'"$HOST_GID"':www-data:/home/www-data:#' /etc/passwd
RUN sed -ri 's#^www-data:x:33:#www-data:x:'"$HOST_GID"':#' /etc/group
RUN mkdir /home/www-data && chown -R www-data:www-data /home/www-data
USER www-data
  1. Container’ı derlerken host’unuzun uid ve gid değerlini argument olarak ekleyin.
docker build --build-arg HOST_UID=$(id -u) --build-arg HOST_GID=$(id -g) .

Detay

Yukarıdaki şekilde container’ı derlediğinizde Dockerfile aşağıdaki işlemleri yapacak:

  1. Argument(buildda kullanılan değişken) olarak alınan uid ve gid değeri env(terminalde kullanılan değişken)’a aktarılıyor.
  2. /etc/passwd ve /etc/group dosyalarında tutulan www-data kullanıcısının uid ve gid değeri host’tan gelen uid ve gid değeri ile değiştiriliyor.
  3. www-data kullanıcısının home klasörü root kullanıcısına ait olan /var/www yerine /home/www-data ile değiştiriliyor.
  4. /home/www-data klasörü oluşturulup, klasör sahibi www-data kullanıcısı olacak şekilde değiştiriliyor.
  5. Container’ın varsayılan olan root kullanıcısı yerine www-data kullanıcısı ile çalışması sağlanıyor.

Symfony 4 Kurulumu

Eğer symfony 2 veya symfony 3 kurulumu yapmak istiyorsanız buraya tıklayın.


  • Öncelikle kuruluma başlamadan önce php‘nin en az 7.1 sürümünün ve composer‘ın kurulu olduğundan emin olun.
  • Daha sonra işletim sisteminizin terminalinde aşağıdaki komutu çalıştırın.
composer create-project symfony/website-skeleton projem
  • Bu komut çalıştırıldıktan sonra aşağıdaki gibi bir çıktı oluşmalı.
  • Bu aşamada symfony 4 projesi kurulumu tamamlandı. Projeyi geliştirme(dev env) modunda çalıştırmak için aşağıdaki komutları çalıştırın.
cd projem
php -S 127.0.0.1:8000 -t public
  • Bu komut çalıştırıldıktan sonra projeniz 8000 portundan yayına başlayacaktır. Tarayıcınızda http://localhost:8000/ adresini ziyaret edip projenizi görüntüleyebilirsiniz.

Docker Container Permission Sorunu Çözümü

Eğer container’larınızın ortak kullandıgı bir volume’e container’lar farklı user’lar ile dosya/klasör oluşturuyorsa, dosya izini sorunları yaşabilirsiniz.(permission denied)

Örneğin php-fpm image’ını kullandıgınızı varsayarsak, projenizi webten(php-fpm) çalıştırdığınızda dosyalar www-data kullanıcısına ait olacaktır. Eğer terminalden(php-cli) çalıştırırsanız dosyalar root kullanıcısına ait olacaktır.

Çözüm

Dockerfile’ınıza aşağıdaki satırı ekleyin.

USER www-data

Bu işlemi yaptığınızda container’ınıza docker exec ile gönderdiğiniz komutları www-data kullanıcısıyla çalıştıracaktır.

Örnek Senaryo

Symfony framework kullanıyorsanız aşağıdaki komutu çalıştırdığınızda projenizin cache’leri silinecek ve cache klasörünüze root kullanıcısına ait bazı dosyalar oluşacaktır.

docker exec php_prod php bin/console cache:clear

Daha sonra tarayıcınızda sitenizi açmaya çalıştığınızda php-fpm bu cache dosyalarına www-data kullanıcısıyla erişmeye çalışıp, bu kullanıcının yetkileri root kullanıcısının dosyaları okumaya veya yazmaya yetmediği için dosya izni hatası veya sonsuz döngü şeklinde sorunlarla karşılacaksınız.

Yukarıdaki çözümü uyguladığınızda cache dosyaları www-data kullanıcısı tarafından oluşturulduğu için yine aynı kullanıcı ile sorunsuz cache dosyalarınıza erişebileceksiniz.

Symfony Kurulumu

Eğer Symfony 4 kurulumu yapmak istiyorsanız buraya tıklayın.


Symfony Nedir?

PHP web uygulamaları için MVC mimarisine sahip bir web çatısıdır. 2005 yılından beri geliştirilmektedir. Drupal, phpBB, Laravel ve Composer gibi bir çok popüler projenin altyapısında kullanılmaktadır.


Symfony Nasıl Kurulur?

Kurulum için öncellikle işletim sisteminizin terminal’ini açınız. Daha sonra işletim sisteminizin tipine göre aşağıdaki komutları sırasıyla kullanınız.

Linux ve Mac OS X Kurulumu

sudo curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony
sudo chmod a+x /usr/local/bin/symfony

Windows Kurulumu

php -r "file_put_contents('symfony', file_get_contents('https://symfony.com/installer'));"

Not: Bu aşamada yeni symfony projesi oluşturmamızı sağlayan Symfony Installer adlı aracı kuruyoruz.


Yeni Symfony Projesi Nasıl Oluşturulur?

İlk projenizi oluşturmak için symfony komutunun new methodunu kullanabilirsiniz.

Linux ve Mac OS X Proje Oluşturma

# Kullanımı
symfony new [proje_ismi] [symfony_sürümü]
# Örnek
symfony new blog 2.8

Windows Proje Oluşturma

# Kullanımı
php symfony new [proje_ismi] [symfony_sürümü]
# Örnek
php symfony new blog 2.8

Not: Eğer symfony sürümünü yazmazsanız symfony’nin tavsiye ettiği sürüm kurulacaktır.


Symfony Nasıl Çalıştırılır?

Symfony projeleriniz 2 farklı modda çalışabilir. 1. si production environment (prod) 2. si developer environment(dev)’tır.

Prod modda kullanıcıya teknik detaylar gösterilmez, bu mod projenizi sunucunuza yükleyip sunacağınız moddur.

Dev modda ise symfony’nin profiler sistemi tüm isteklerin kaydını tutar, siz başka bir sayfaya geçseniz bile geçmiş kayıtlardan tüm sayfaların nasıl oluşturulduğuna dair detaylı istatistikleri görebilirsiniz.

Production Environment Proje Çalıştırma

Klasik php projelerinden temel farkı varsayılan olarak proje dizini web’tir yani tarayıcı üzerinden doğru adresi açmanız yeterli olacaktır. Hosting kontrol panelinizin klasör yapısı ile uyumlu olması için bu klasörü istediğiniz gibi değiştirebilirsiniz, örneğin public_html yapabilirsiniz.

Developer Environment Proje Çalıştırma

Öncelikle symfony console aracı ile sunucuyu başlatmalısınız. Daha sonra terminal’de göreceğiniz adresi tarayıcınızda açarak projenizi görüntüleyebilirsiniz.

Symfony2 için:

# Geliştirme sunucusunu çalıştırır.
php app/console server:run
# Geliştirme sunucusunu arkaplanda çalıştırır.
php app/console server:start
# Geliştime sunucusunu kapatır.
php app/console server:stop

Symfony3 için:

# Geliştirme sunucusunu çalıştırır.
php bin/console server:run
# Geliştirme sunucusunu arkaplanda çalıştırır.
php bin/console server:start
# Geliştime sunucusunu kapatır.
php bin/console server:stop

Not: Symfony2’den Symfony3’e geçerken console dosyası app’den bin’e taşındığı için kullanacağınız komutların klasörünün doğru olduğundan emin olun.


Symfony2 Kurulumu Ekran Görüntüleri

symfony2-kurulumu

symfony2-homepage

Bu kurulum aşamaları aşağıdaki geliştirme ortamlarında test edilmiştir.

İşletim Sistemi: Ubuntu 14.04, Windows 10, Debian 8, Ubuntu 16.04, CentOS 7

PHP Sürümü: 5.6, 7.0, 7.1

Symfony Sürümü: 2.8.x, 3.2.x, 3.3.x