Php Nedir ? Nasıl Çalışır ?
Kişisel ana sayfa (Personal Home Page) olarak isimlendirilmiş daha sonrasında Hypertext Preprocessor yani üstünyazı önişlemcisi olarak isim değiştirmiş çok geniş kapsamlı genel kullanıma açık bedik* bir yazılım dilidir. İlk olarak 1995 yılında danimarka kökenli kanadalı yazılımcı Rasmus Lerdorf tarafından geliştirildi. Html olarak hazırlanmış kişisel sitesini static olarak kullanımından dinamik olarak kullanıma geçirebilmek için perl ile geliştirilen CGI betikleri yazmıştır. Rasmus bu betikler yardımıyla özgeçmişini sitede görüntülüyor ve sitenin ziyaretçi trafiğini kaydediyordu. Bir süre sonra web formları ile etkileşime girebilecek, veritabanları ile iletişim kurabilecek ve daha hızlı çalışabilecek şekilde bu betikleri C ile yeniden kodları ve bu uygulamaya Kişisel Ana Sayfa/Form Yorumlayıcı (PHP/FI, İngilizce: Personal Home Page/Forms İnterpreter) adını verdi. Sözdizimi genel olarak Perl’e benzese de daha kısıtlı ve basit ancak daha tutarsızdı. Bir geliştirme takımıyla aylar süren çalışma ve test aşamalarının ardından PHP/FI 2 sürümü 1997 Kasım ayında resmi olarak duyuruldu.
*Betik dili (İngilizce: scripting language veya script language), betik yorumlamak için yazılmış özel çalışma-zamanı sistemlerinin (run-time environment) yorumlayabileceği programlama dilleridir. Diğer programlama dilleri ile yazılan kodlar makine koduna çevrilip çıkan program doğrudan çalıştırılırken betik kodları interpreter tarafından doğrudan okunur ve yorumlanarak işlemler interpreter'ın kendisi tarafından yapılır.
Zeev Suraski ve Andi Gutmans 1997 yılında yorumlayıcıyı baştan yazdılar ve dilin ismini PHP: Hypertext Preprocessor olarak değiştirerek PHP 3’ün temellerini attılar. Bunu PHP 3 ün herkese açık olan test sürecinin başlaması izledi ve 1998 yılının Haziran ayında PHP 3 resmi olarak duyuruldu. Suraski ve Gutmans bu sürecin ardından PHP’nin çekirdeğini sil baştan kodlamak suretiyle 1999 yılında Zend Motorunu geliştirdiler ve İsrail’in Ramat Gan kentinde Zend Technologies isimli bir şirket kurdular.
22 Mayıs 2000 tarihinde temelleri Zend Engine 1.0 ile güçlendirilmiş PHP 4 duyuruldu ve Ağustos 2008 itibariyle 4.4.9 sürümüne ulaşana kadar aktif olarak geliştirildi. Bugün PHP 4 ün geliştirilmesi durdurulmuştur ve güvenlik güncellemeleri dahil olmak üzere üzerinde hiçbir iyileştirme yapılmamaktadır.
13 Temmuz 2004 tarihinde yeni Zend Engine II ile güçlendirilmiş PHP 5 yayınlandı. PHP 5, nesneye yönelik programlama için çok daha fazla olanak sağlıyor, PHP Veri Nesneleri (PDO) eklentisi yardımıyla veritabanlarına erişim için oldukça tutarlı ve hızlı bir arayüz yanında performansa yönelik çok sayıda iyileştirme barındırıyordu. 2008 yılında PHP 4 ün tutarlı sürümünün yayınlanması durduruldu ve PHP 5 geliştirilmesi devam eden tek tutarlı sürümüdür.
ODBC eklentisi ile standartları destekleyen bir bağlantı açmak da oldukça kolay oluyor. Diğer veritabanları için de CouchDB gibi soketler ya da cURL eklentileri kullanılabiliyor. Yönetilebilir küçük web siteleri için de genellikle MySQL veritabanı kullanmak çok daha sağlıklı oluyor. Birkaç PHP komutu ve fonksiyonları kullanarak oldukça hızlı bir bağlantı sağlamak mümkün hale geliyor.
Composer, php için bağımlılık yönetim aracıdır. Projeleriniz de ihtiyaç duyduğunuz kütüphaneleri ve sınıfları sizin için kurmanızı sağlar. Composerda veriler json olarak saklanır ve paketleri oluşturulması json olarak sağlanır. Composer sayesin tüm paketler ve sınıflar kolayca otomatik yüklenir.
Php Nasıl Çalışır ?
Hepimizin bildiği bir şey varsa oda kullanmış olduğumuz tarayıcımıza bir url girip sonrasında belirtilen domain name yönlendirilmiş olan ip ile sucu istek oluşur. İstek sonucunda bize geri html döndürür ve bunu browser yorumlayarak siteyi gösterir.(Temel anlamda bu şekilde çalışır) Bu aşamaya kadar bilindik bir durum. Peki sunucu da ne olur html nasıl döner. Php burda görevi nedir ve nasıl yorumlanır.
Bu pek çoğumuzun verebileceği bir soru değil maalesef. Hepimiz web sitesi nasıl kurulur biliriz (En azından bilmeliyiz !) . Lakin php nasıl çalıştığını bilmeyiz.
Peki zaten site çalışıyor. İstediğimiz şekilde bize yanıt döndüğünce neden bilmeliyim dediğiniz duyar gibiyim. Evet çalışıyor peki performans iyileştirmesi yapmak için bunu bilmemiz gereklidir. Bunu bilmek için bellek yönetimini anlamalıyız.
Php İstediğinin Ömrü
Derlenmiş bir dil (Java ve C#) kullandıysanız daha önce php onlarla aynı olmadığını baştan belirteyim. Php yorumlanmış bir dildir. Yani tarayıcıdan gelen her talep için php yorumlayıcısı html den php kodunu ayırarak kodu yorumlar ve geri dönüş sağlar.
Bu işlemi hızlandırmak için önbelleğe almak ve diğer optimize çalışmaları yapabilirsiniz. Ama temel olarak çalışma sistemi bu şekildedir.
Yukarıda diagrama göreceğimiz şekilde istek önce web tarayıcısında başlar. Daha sonrasında web server ulaşır. Web sunucusu daha sonra onu analiz edecek ve onunla ne yapılacağını belirleyecektir.
Web sunucu isteği PHP dosyası olduğunu belirlediğinde,(Bu genellikle index.php) bunu php yorumlayıcısına iletir. PHP yorumlayıcısı php dosyasını okuyacak, onu (ve içerdiği diğer dosyaları) ayrıştırıp çalıştıracaktır. PHP yorumlayıcı kodu çalıştırmayı bitirdiğinde bir çıktı verir. Bu çıktı web sunucusu web tarayıcısına yanıt olarak döndürür.
PHP Uygulamaları Sadece Bir Bedik !!!
PHP isteğinin yaşam döngünü anlatmamın nedeni bu ifadeye ulaşmak içindir. Örneğin projenizde Laravel , Symfony veya zeroneed uygulaması olsun,herhangi bir php uygulamasının ardında yatan gerçek budur.(drupal veya wordpress gibi CMS de dahil) Bunlar bir kabuk komut dosyalarına benzeyen komut dosyalarından başka birşey değildir.
Bu senaryoda web sunucusu aracı görevi görmektedir. Web tarayıcıdan php istediği geldiğinde web server php betiğini tetikler. Sonucunda bir çıktı varsa bunu tarayıcıya iletir.
Bu, diğer web programlama dillerinde göreceğinizden farklı bir durumdur.Bu web programlama dilleri, daha geleneksel web uygulaması dediğimiz şeyi oluşturur. Bu web programlama dilleri uygulama sunucusu kullanarak çalışır. Bazı bilinen uygulama sunucuları java için tomcat, .net için ISS ,Python için Gunicorn ve Ruby için se Unicorn.
Gördüğünüz gibi , web uygulaması sunucu içerisindedir. (Uygulama sunucus başına birden fazla uygulama bile barındırabilir) Bu uygulama sunucu aynı zamanda web sunucusu görevi görmektedir. PHP’de olduğu şekilde bir aracı servis hizmeti sağlamaz.
Diğer Web Uygulamalarından Temel Farkı
Bir PHP uygulaması ile daha geleneksel web uygulaması arasındaki bu temel fark önemlidir. Bu çerçevede bir çok dinamik değişir. Örneğin, bu nedenle bir sunucuda ki herhangi bir PHP dosyasını değiştirebilir ve değişikliği hemen görebilirsiniz.(Ön belleğe alma şeklinde bir çözümünüz yoksa !)
Ancak geleneksel web uygulamalarında aynı şeyi söylemek pek mümkün değildir. Bu uygulamalarda sadece şablonla ilgili değişiklik yapabilirsiniz. Tabi bu değişiklikleri görüntülemek için sunucuyu yeniden başlatmanız gerekebilir. (Eğer derlenmiş bir dilse durum daha karmaşık bir hal almaktadır.)
Bununla birlikte, bir PHP uygulaması ile geleneksel bir uygulama arasında ki tek fark bu değildir. Bilinmesi gereken diğer farklar şöyledir.
Hafıza Yönetimi
Hafıza yönetimiyle başlayalım. Bir PHP uygulamasında çalışırken belleği (RAM) nasıl yönetiriz? Cevap şu ki ,bir PHP uygulamasıyla çalışırken çoğumuz belleği yönetmiyoruz.
Sadece bize yetersiz bellek uyarısı verdiğinde, PHP bellek sınırını artırır ve çalışmaya kaldığımız yerden devam ederiz.
Bellek Sızıntısı
PHP’de hiç bellek sızıntısı ile karşılaştınız mı ? Bellek sızıntısı, bellek yetersizliği durumlarında bellek yönetimi için yapılan hatalar sonucunda meydana gelen durumlardır. Bir uygulamada kullanmış olduğunuz değişkenleri oluşturur kullanır ve bellekten temizlemezseniz. Uygulamanız her çalıştığında yeniden yeniden aynı değişkeni oluşturacağı için bellek boşalmaz ve sürekli dolmasından dolayı bellek yetersizliği meydana gelir. Bunu geleneksel web uygulamaları çöp temizleme (GC Collection) yöntemi ile kontrol sağlanmıştır.
Bu durumda PHP bu durum neredeyse hiç olmaz. Bunun nedeni ,PHP’nin çalışan ve sonra sona eren bedik bir dil olmasıdır. Sonlanan her komut PHP komut dosyası tarafından otomatik olarak silinecektir.Bu nedenle çoğu PHP uygulaması bellek sızıntısı meydana gelmez.
Ancak bu durum geleneksel bir web uygulamasında böyle değildir. Uygulama sunucusu web sunucusunun bir parçası olmasından dolayı, yalnızca web sunucusu yeniden başlatıldığında sona erer.Bu çok sık olan bir durum değildir.(Olmaması lazım!) Bellek yönetimi bu şekilde web uygulamalarında bir gerçekliktir.
Bellek sızıntısın, daha geleneksel bir web uygulamasıyla gerçek sonuçları olur. Uygulama sunucusunu yeniden başlatmalısınız, sunucu hafızası bir noktada biter. Bu olduğunda, web uygulamanız çöker ve erişilmez duruma gelir. Bu duruma “Web Sitesi Çöktü” deriz.
Veri Kalıcılığı
Peki PHP için neden bellek sızıntısı olmadığını anladık. PHP uygulamamız için iki özdeş isteğimiz olduğunu düşünelim. İlki, PHP betiğimiz üzerinde çalışır ve işlem sırasında verileri bellekte depolar. Bu verilerin hiçbir ikinci talep için mevcut olmayacaktır. Bu, PHP’nin geleneksel web uygulamalarında ki gibi istekler arasında veri paylaşamayacağı anlamına gelir.
Bunun yerine, PHP, istekler arasında veri paylaşmak için diğer sistemlere bağlıdır. Bir depolama yöntemi kullanan oturum (Çerez ve Session) yöntemini kullanabilirsiniz. Bir depolama yönetimi kimi zaman bir dosya bir veri deposu hatta bir veritabanı olabilir.
Bir PHP uygulaması bir veya birden fazla depolama yönetimi kullanımı eğilimindedir. Hangilerini kullanacağınız yapmış olduğunuz projeye göre değişiklik gösterir. Ancak birini seçmeniz gerekliyse bu Redis veya Memcached gibi populer seçenekleri değerlendirebilirsiniz.
Eş Zamanlı Görevler
Eşzamanlılık, PHP uygulamalarında anlaşılması gereken önemli bir kavramdır. Peki eşzamanlılık nedir ? Bu, yazılımı daha küçük parçalara ayırabileceğimiz fikridir.Daha sonra küçük parçaları aynı anda veya farklı sırayla hiçbir şey sorun meydana gelmeden çalıştırabilirsiniz.
PHP için pek mantıklı bir durum değildir. PHP uygulamalarınız daha küçük parçalara ayrılamaz. PHP birçok istediği aynı anda yorumlaması zaten eşzamanlı çalıştığı anlamına gelir.
Şimdiye kadar gördüğümüz gibi, bir PHP uygulması yapılan her iste diğerinden bağımsızdır. Web sunucusu, isteği PHP uygulamamızın komut dosyası çalışacak olan PHP yorumlayıcısına iletecektir. Bu, PHP yorumlayıcısının aynı anda birden fazla komut dosyasının işlemesinin çok yaygın olduğu anlamına gelir.
Yukarıda ki zaman çizelgesi, bir zamanı çizelgesi kullanarak bunu vurgulamaya çalışır. Bir PHP betiğinin aynı anda üç işlemine sahibiz. Farklı zamanlarda başlar ve biter, ancak uygulamaların bazıları çakışır.
Bu nedenle PHP uygulaması çalışırken eşzamanlılığı göz önünde bulundurmalısınız.
Çoklu Görev
Çoklu görev, bir dizi bilgisayar görevinin aynı anda yapılması demektir. Bu durum işlemlerin daha hızlı gerçekleşeceği fikridir. PHP uygulamaları, yoğun bilgi işlem görevlerini yapmak için bu konsepte çok güvenir.
Bunun nedeni, PHP’de çoklu görev gerçekleştirmenin oldukça kolay olmalısıdır. Daha önce gördüğümüz gibi, PHP yorumlayıcısının aynı anada birden fazla betiği işlemesi mümkündür. Dolayısıyla , çoklu görev, yapmamız gereken bu istekler için ekstra görevler oluşturmamız yeterlidir.
Bu nasıl oluyor peki ? Yukarıdaki diyagramda bir tane ana isteğimiz var. Bu ana istek alt istekleri oluşturmaktadır. Bu diğer alt talepler yeni uygulama görevlerimizdir. İlk taleple aynı zamanda çalışırlar.
Bu isteklerin genellikle eşzamanlı olarak gönderildiğini belirtmek gerekir. Bir PHP betiği çalıştırılması süresi üzerinden büyük bir etkisi yoktur. Bu, ilk istek sırasında PHP uygulamasının çalışmasını yavaşlatmadıkları anlamına gelir.
PHP uygulamasında çoklu görevin iyi bir örneği, populer PHP CMS’lerinde cron işlemlerini nasıl işlediğidir.Bir CMD’de cron işi, CMS üzerinde ihtiyaç duyduğunuz, gelecekte planladığınız (gelecekte bir gönderiyi yayımlamak gibi) bir görevdir.CMS bir cron talepte bulunulduğunda belirli bir URL için bir istek oluşturur.
Kaynak Sorunu
Ancak eş zamanlı da sorunsuz değildir. En yaygın sorunu kaynak yetersizliğidir. Eşzamanlı PHP işlemlerinizin çalışması için ihtiyaç duyduğu belleğe sahip olmadığı anlamına gelir.
Daha öncesinden gördüğümüz bellek sızıntısı bir tür bellek yetersizliği olduğunu belirtmek gerekir. Artan bellek sızıntısı, uygulama çalışmayı durduana kadar suncu belleğini yok eder. Anacak, PHP uygulamaları bellek sızıntılarından müzdarip olmadığındani buradaki sorunun kaynağı bu değildir.
Sunucunuzun 500 mb boş belleğe sahip olduğunu düşünelim. PHP uygulamanız çalışırken 100 mb ihtiyac olduğunu varsayalım. Bu durumda sunucunuz yalnızca beş tane eş zamanlı yürütmeyi işleyebileceği anlamına gelir.
Peki sunucunuz bir seferde beşten fazla komut dosyaısı işlemesi gerekiyorsa ne olur ? Bu noktada, ana makinenizin sunucunuzu nasıl yapılandırdığına bağlı. Sadece yavaşlayabilir yada tamamen çökebilir. (Çoğu hizmet DDOS saldırılarının arkasında ki ana fikir budur)
Bu nedenle kaynak açlığı PHP uygulamanız için çok fazla sorun teşkil etmez. Evet, bellek kullanımını azaltabilirsiniz. Ve sonuç olarak ,PHP uygulamanız daha fazla eş zamanlı çalıştırma gerçekleştirebilirsiniz.
Aynı Anda Çalışma Sorunları
Eşzamanlı ilgili dikkat edilmesi gereken konulardan biride birlikte çalışmasıdır. Bu durumun anlatılmasında bir örnek anlatılması daha kolay olacaktır. Aynı anda çalışma sorununa örnek olarak, sayfa görüntülemelerin izlenmesi olarak verilebilir.
Yukarıda, sayfa görüntülemelerin izleyen bPHP kodumuzun bir zaman çizelgesi gözükmektedir. Sayfada pembe olarak belirtilen kısım sayfanın görüntülenme sayısını belirten kod yer almaktadır. Şimdiye kadar her şey çok basit bir şekildedir.
Şimdi durumu biraz daha karmaşık hale getirip eş zamanlı çalışmayı ekleyelim. Peki bu durumda ne olur ? Bunu zaman çizelgemizi güncelleyelim ve öğrenelim.
Bu zaman çizelgesinde de her şey yolunda gözüküyor. PHP kodumuzun birden fazla çalıştırılması var, ancak pembe çubukların hiçbiri çakışmıyor. Her yürütme, geçerli sayfa görüntüleme sayısını getirebilir, bir artabilir ve ardından tekrar kaydedebilir.
Gerçek Uygulamarda Aynı Anda Çalışma Durumu
Ancak PHP kodumuzun birden fazla çalışması çakışması durumunda ne olur ? Sonuçta, çalışan kodların her zaman bu şekilde birbirini izleyen şekilde çalışması ve tamamlanması gerçekci bir durum değildir. İşte işlerin karışmaya başladığı nokta burasıdır.
İşte üç işlemimizin zaman içinde birbirine daha yakın olduğu bir zaman çizelgesi. Gördüğünüz gibi, PHP kodunu takip eden sayfa görüntüleme sayfamızın çalışması şimdi çakışıyor.
Bu nedenle, ikinci işlemin sayfa görünümü artışı yanlıştır. Bunun nedeni, ilk işlem onu geri kaydetmeden önce sayfa görüntüleme sayısını getirmesidir. Bu nedenle, ilk işlem olarak aynı sayıda sayfa görüntülemesini sayar.
Ama bu da sonu değil! Yarış durumu nedeniyle, üçüncü işlem ayrıca ikinci işlem tarafından kaydedilen sayfa görüntülemelerinin sayısının üzerine yazar. Daha fazla eşzamanlı işlemimiz olsaydı, bu yarış durumunun neden olduğu sorunları daha da karmaşık hale getirirdi.
Sonuç, sayfa görüntülemelerinin sayısının hatalı bir şekilde izlenmesidir. Sayfa görüntüleme izleme kodumuz, üç sayması gerekirken yalnızca iki sayfa görüntülemesi saydı. Böyle bir sistem tasarlamaya zahmet ettiyseniz bu ciddi bir problemdir.
Durumunun Düzeltilmesi
Bu durumu düzeltmenin bariz çözümü bu şekilde yapmamak veya Google Analytics gibi harici bir hizmet kullanmaktır. Tabi bu durumda bu gibi eşzamalı sorunlarını çözmeyi öğrenemeyiz.
Bu durumun düzeltilmesinde anahtar kelime karşılıklı dışlamadır. Bu karşılıklı dışlamanın kendisi eşzamanlı kontrolü adı verilir. Ve eşzamanlı kontrolünün amacı, eşzamanlı işlemlerin (sayfa görüntülemelerin izlenmesi gibi) doğru sonuçların üretilmesini sağlar.
Şimdi karşılıklı dışlamaya dönelim. Karşılıklı dışlama, bir seferde yalnızca bir yürütmenin kritik bir kod parçasına gireceği fikridir.Bu durumda ziyaretci sayısını hesaplayan kod bir sefer çalışacak ve bitiminde yeniden çalışarak doğru izleme sayısını verecektir.
PHP’nin Avantajları Nelerdir?
PHP ile web sitesi sorun yaşamadan yönetilebilir ve geliştirilebilir. Günümüzde yaygın olarak kullanılmasının ve tercih edilmesinin başlıca nedenleri aşağıda listelenmiştir.
- PHP web siteleri için gereken tüm araçları ve çözümleri ücretsiz olarak sunan açık kaynaklı bir dildir.
- Açık kaynaklı olması sebebiyle yaygın biçimde kullanılır ve PHP gelişimine herkes katkıda bulunur, sürekli geliştirilir. PHP dilinde kod yazarken herhangi bir sorun karşılaşılırsa internette yapılacak kısa bir arama ile soruna yönelik çok sayıda cevap bularak hızlı bir şekilde destek bulunabilir.
- Açık kaynak kodlu ve ücretsiz olmasının avantajlarından biri de PHP dosyalarına çevrimiçi olarak kolayca erişmenin mümkün olmasıdır.
- PHP’nin sunduğu diğer bir özgürlük ise açık kaynak kodlu olduğu için Notepad gibi basit bir editör ya da Notebook ++,Sublime Text, jEdit, Emacs ve Bluefish,Phpstorm,Visual Studio Code, gibi daha gelişmiş editörler ile kullanılabilir.
- PHP birden fazla işletim sisteminde, Linux, Unix türevi, Microsoft Windows, Mac OS X, RISC OS dâhil olmak üzere çok çeşitli platformda çalışabilir.
- PHP, farklı hizmetlerle LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM ve daha sayısız protokol aracılığıyla iletişim kurabilecek bir altyapıya sahiptir.
- Java nesnelerinin oluşturulabilmesi ve şeffaf biçimde PHP nesneleri olarak kullanılabilme leri önemli bir diğer özelliktir.
- Diğer bir avantaj, ileri seviyede özelliklere sahip olmasına rağmen kolay kullanımlı bir programlama dilidir bu durum PHP’nin öğrenilmesini oldukça kolaylaştırıyor ve PHP dilinin tercih edilmesini sağlıyor.
- Çok fazla sistem kaynağı gerektirdiğinden, PHP diğer dillere kıyasla çok daha hızlıdır. Farklı yazılımlarla çalıştığında bile diğer işlemleri yavaşlatmaz.
- Diğer dillere nazaran oldukça hızlı, güvenli ve ölçeklendirilebilir dir. Siteleri saldırılardan, tehditlerden ve virüslerden korumanın en güvenli yollarını sunar.
- Modüler sistemiyle XML ve daha pek çok kütüphaneyle entegre edilebildiği için her işletmeye özgü özel ihtiyaçları karşılayabilir.
- PHP çekirdek fonksiyonlarını genişletecek sayısız uzantıyı da içerir. Kullanıcının kaynak kodunu XML manipülasyonu ile kontrol edebilmesini sağlar. Bu özellik sayesinde her türlü uzantı ayarıyla entegre edilebilir.
- Çok fazla trafiği olan web sitelerinde sorunsuz bir şekilde çalışır.
- PHP hem Frond-End hem de Backend web geliştirmede kullanılabilir.
- PHP nin en güçlü ve en çok üstünde durulan özelliklerinden biri, sahip olduğu geniş ve gelişmiş veri tabanı desteğidir. Bunlar MySQL, Oracle, Sybase, DB2, vb. şekilde çeşitlendirilebilir.
- Yardımcı sınıflar sayesinde birçok dosya formatını okuma ve üzerinde işlemler yapılabilmesine imkân tanır.
- PHP sunucu taraflı iletişimler için yaratılmış bir programlama dilidir. Bu nedenle form verisi toplamak, sunucuda dosya yönetmek, veri tabanlarını düzenlemek vb. gibi çeşitli sunucu taraflı fonksiyonları yapabilir.
Kullanılacak Frameworkler
Web Sunucusu
I am text block. Click edit button to change this text. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.