Çarşamba, 29 Ocak 2014

Paylaşımlı Sunucularda Tek System Altında Çoklu Uygulama Kurulması

 

Öncelikle, CodeIgniter`ın durumu hakkında bir gelişme olmadığını belirterek yazıya başlamak isterim. Bildiğiniz gibi Temmuz 2013 tarihinden itibaren Ellis Lab. devredecek birilerini aradığını belirtmiş olmasına karşın, henüz yeni sahibi olarak kimseyi seçmediler.

Herçeyin çok hızla değiştiği ve geliştiği günümüzde altı aylık bir bekleme süresinin çok anlamsız olmasına rağmen, firmanın CodeIgniter`ın hakkını başkasına teslim etmek konusunda bile hevesinin kalmadığı ortadadır. Bu nedenle, işinizi gördüğü yerde CodeIgniter kullanmanızı, yetmediği yerler için de yeni uygulama çatılarını öğrenmenizi tavsiye ederim. Sonuçta hangi konu olursa olsun, körü körüne fanatik derecesinde bağlı olmanın zararı, sadece size dokunacaktır. Bana en çok sorulan sorulardan biri olan "CodeIngiter ne olacak?" sorusuna böylelikle yanıt verdiğimi umud ediyorum.

Bugün anlatacağım konu: paylaşımlı sunucularda (shared hosting) iki farklı uygulamayı, tek CodeIgniter kurulum ve alt-isimler ile (subdomain) yönetmek.

Paylaşımlı sunucular, ucuz olmaları nedeniyle halen çoğumuzun tercih ettiği bir hizmettir. Ucuz olmaları nedeniyle kullanıcılarına shell erişimi imkanı tanınmaz. Bu nedenle kullanıcının yapabileceği işlemler sınırlıdır. Bu yazıda, ğaylaşımlı sunucu kullanım yetkileri dahilinde bu konuyu nasıl çözeceğimizi göreceğiz.

Önce yapıyı görelim: Diyelim ki, iki farklı uygulamayı tek bir sunucu üzerinde çalıştırmak istiyorsunuz. Birinci uygulama, sitedadi.com domain adresi ile erişilen, şirketinizin/ürününüzün tanıtım sayfası olsun (application1 isimli uygulama dizini). İkinci uygulamanız ise, online.siteadi.com adresi olarak bir sub-domain adresi ile eriştiğiniz, asıl ürününüzün gösterildiği site olsun (application2 isimli uygulama dizini).

Her iki site de CodeIgniter üzerinde çalıştığı için, iki farklı CodeIgniter kurulumu yapmanız yerine her ikisinin de ortak çalıştırdığı (system dizini) bir kurulum olmalıdır. Böylece güncelleme gerekirse tek system dizinini güncellemeniz yeterlidir.

Yapımızın dizin görüntüsü şöyledir:

-main
--assets
--application1
----cache ~ views
--application2
----cache ~ views
--system
-online

Yukarıdaki yapıyı paylaşımlı sunucumuzun www (public_html) dizini altına oluşturuyor, dosyaları yüklüyoruz. Öncelikle www dizini altına (public_html) bir .htaccess dosyası yazmalıyız ki, bu adrese gelen kullanıcılar main dizini altına kurduğumuz yapıya erişsin:

<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteBase /

 RewriteCond %{HTTP_HOST} ^([^\.]+)\.siteadi\.com$ [NC]
 RewriteCond %1 !^(www|ftp|mail|ssl)$ [NC]
 RewriteRule ^.*$ http://www.siteadi.com/%1 [R,L] 
 RewriteCond %{REQUEST_URI} !^main/index.php/$1
 RewriteRule (.*) main/$1 [L]

</IfModule>

<IfModule !mod_rewrite.c>
    ErrorDocument 404 /index.php
</IfModule> 

main dizini altındaki .htaccess dosyamızın içeriği, kullandığımız normal CI dosyası gibi olmalıdır:

#Options +FollowSymlinks

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|assets|robots\.txt|favicon\.ico)
RewriteRule ^(.*)$ index.php/$1

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(application1|system) index.php/$1 [L]

Burada dikkat etmemiz gereken bir nokta, main dizini altındaki index.php dosyasında geçen $application_folder değişkeni applicaiton1 isimli ana sayfayı işaret etmelidir.

 $application_folder = 'application1';

Buraya kadar, siteadi.com adresine gelen kullanıcıların application1 uygulamasına yönlendirdir. Sıra online.siteadi.com alt-ismine gelenleri tespit ederek applicaiton2 uygulamasına yönelendirmekte. Bu amaçla açtığımız online isimli dizinin altına .htaccess dosyasını ekliyoruz:

#Options +FollowSymlinks

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|assets|robots\.txt|favicon\.ico)
RewriteRule ^(.*)$ index.php/$1

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(application2|system) index.php/$1 [L]

Yine online dizini altına index.php dosyasını ekliyoruz. Ancak buradaki $application_folder değişkenini application2 olarak değiştirmeyi unutmuyoruz:

 $application_folder = 'application2';

Şimdi paylaşımlı sunucularda yapılması gerekli olan püf noktası: online dizini altına, sadece bir kere çalıştıracağımız symlink.php isimli bir dosya ekliyoruz.

symlink('/home/siteadi/public_html/main/system', '/home/siteadi/public_html/online/system');
symlink('/home/siteadi/public_html/main/application2', '/home/siteadi/public_html/online/application2');
symlink('/home/siteadi/public_html/main/assets', '/home/siteadi/public_html/online/assets');

Daha sonra online.siteadi.com/symlink.php adresi ile bu dosyayı çalıştırıyoruz. Bunun ardından online dizini altına üç tane sembolik link oluşturulur. Böylece online.siteadi.com adresine gelenler, application2 yi kullanmak için yönlendirilirler. Bu işlemin bir kere yapılması yettiğinden, symlink.php dosyası dizinin altından silinebilir.

Her iki uygulama aynı veritabanına bağlanabileceği gibi, farklı veritabanlarına da erişebilirler. application altındaki config dizinleri farklı olduğundan iki farklı ayar ile çalıştırmak mümkündür. System dizinleri ortak olduğu için de sadece bir defa güncellemek yeterlidir.

Fırsatım oldukça yeni konuları burada paylaşmaya devam edeceğim.

Çarşamba, 10 Temmuz 2013

CodeIgniter Yeni Sahibini Bekliyor

 

CodeIgniter, bir kaç gün önce çıkardığı 2.1.4 güncellemesi ardından, 9 Temmuz 2013 tarihli EllisLab açıklaması ile yeni bir geleceğe doğru yola çıktı.

Bir süredir yayınlanması beklenen 3.0 versiyonu geliştirmeleri sürerken EllisLab tarafından beklenmedik bir açıklama yapıldı. Bu açıklamada, CodeIgniter`ın artık şirket iş planlarına uygun olmadığını ve topluluğun yönetilmesi, yeni versiyon çıkartılması işinin kendileri için bir külfet meydana getirdiğinden bahsedilmektedir.

Blog yazısına gelen görüşlere verilen cevaplar arasında CodeIgniter kurucusu Rick Ellis`in özetlediği durum aslında bir çok şeyi özetler nitelikte. CodeIgniter`in kendine ait özel bir proje ile yola çıktığını ancak geldikleri noktada, artık yönetemediklerini ve isteklilere devretmek istedilerinden bahsetmektedir.

Hızı ve kullanımının basitliği kadar, komünitesi bu kadar gelişmiş bir PHP framework`ünün kullanıcı beklentilerine cevap verememesi nedeniyle atıl kalması üzücüydü. Ben EllisLab`ın verdiği bu kararın çok olumlu olduğunu düşünüyorum. CodeIgntier gelişimini komüniteye devretmeleri durumunda dahi çok hızlı bir şekilde, tüm isteklerin karşılanacağı yeni versiyona geçileceğini düşünüyorum.

CodeIgniter şu haliyle dahi bir çok projede sorunsuzca çalışmaktadır. Şimdiye kadar yapılan geliştirmeler de komünitenin gücünü bizlere göstermiştir. Ellislab`in bu kararıyla, CodeIgniterìn daha avantajlı bir framework olacağını umuyorum.

CodeIgniter`ın gelişmekte olan haline github üzerinden erişebilirsiniz.

Salı, 16 Nisan 2013

HMVC Yapısında Kod Tekrarından Kaçınma

 

Genel yaklaşım olarak, MVC yapısında farklı kullanıcı yetkileri ve tipleri tanımlandıkça, Controller kodlarının herbir kullanıcı için yeniden yazılması gerekir.

Model dosyalarının ortak kullanımı sözkonusu olacağı için bunlardaki kodların tekrarlanmasına gerek yoktur. Ancak, Controller kodları için durum farklıdır. Bazı durumlarda birbirine yetki bakımından çok yakın ya da bazı Controller methodlarının aynı olması durumunda, farklı kullanıcı tipleri için aynı kodlar kopyalanıp durur.

Bu tekrardan kaçınmak amacı ile şöyle bir yaklaşım getirilebilir: HMVC kullandığımızı düşünelim. Dashboard isimli modül altında Admin ve Limited isimli iki farklı yetkiye sahip iki kullanıcı olsun. Her iki kullanıcının da ortak kodları aynı isimli bir Controller dosyasında oluşturalım. Application/modules/dashboard/dashboard_controller.php isimli dosyanın içeriği :

<!--?php 
class Dashboard_Controller extends MX_Controller {

 function __construct() {
 
  parent::__construct();
  
  if(! $this--->hmvc_auth->get('logged_in')) redirect(base_url());  
 }
 
 
 function index()
 {
  echo "ERROR! No Pasaran!";
 } 


 protected function main_show_all(){
 
  echo 'Admin ve Limited user ortak oalrak iceride';
 }
 
 protected function main_change_admin(){
 
  echo 'Admin user Change method icin icerdesin';
 }
 
 protected function main_change_limited(){
 
  echo 'Limited user Change method icin icerdesin';
 }
 
}

?>

Yukarıda her kullanıcı için ortak olan kodlar bir araya toplanmıştır. Methodların sadece Admin ve Limited controller dosyalarından bu dosyaya yapılacak istemlerde çalışması için methodlar PROTECTED olmalıdır. HMVC kullanılması nedeniyle, Dashboard_controller< dosyası MX_Controller sınıfını EXTEND etmektedir./p>

Admin kullanıcı için yazılacak modüle ait controller dosyası olan Application/modules/dashboard/admin.php dosyasının içeriği ise:

<!--?php
/*
 Admin user Dashboard Controller
*/

require_once('dashboard_controller.php');

class Admin extends Dashboard_Controller {

 function __construct() {
 
  parent::__construct();

  if(! $this--->hmvc_auth->is_admin()) redirect(base_url());
  
 }
 

 function show(){
  $this->main_show_all();
 }
 
 function change(){
  $this->main_change_admin();
 } 
 
}
?>

Yukarıdaki kodlarda öncelikle dashboard_controller.php dosyası çağırılır. Admin sınıfının Dashboard_Controller sınıfını extend etmesine dikkat edilmelidir. Show isimli method, hem Admin hem de Limited user için aynıdır. Bu nedenle Dashboard_controller dosyasındaki karşılığı olan main_show_all ismi ile çağrılmaktadır.

Ancak, change methodu Admin ve Limited user için farklıdır. Bu nedenle Dashboard_controller dosyasından main_change_admin() isimli method çağrılmalıdır.

<!--?php
/*
 Limited user Dashboard Controller
*/

require_once('dashboard_controller.php');

class Limited extends Dashboard_Controller {

 function __construct() {
 
  parent::__construct();

  if(! $this--->hmvc_auth->is_limited()) redirect(base_url());
  
 }
 

 function show(){
  $this->main_show_all();
 }
 
 function change(){
  $this->main_change_limited();
 } 
 
 
}
?>

Application/modules/dashboard/limited.php dosyasının içeriği ise yukarıdadır. Limited kullanıcısı için show() methodu Admin user ile aynı iken, change() methodu farklıdır. Bu nedenle Dasboard_controller dosyasından Limited user için kullanılmak üzere main_change_limited() isimli methodu çağırmaktadır.

Bu yöntem ile ortak Model dosyası kullanımına benzer olarak, ortak Controller dosyası kullanımı yapılabilir. Sonuçta kodların farklı kullanıcılar için tekrarlanmasının önüne geçilmiş olur.

Bu yöntem kullanılırken dikkat edilecek noktalar:

  • Ortak Controller dosyasındaki methodların PROTECTED olmalıdır.
  • Ortak Controller dosyasında kullanıcının LOGIN olduğu kontrol edilmelidir.
  • Ortak Controller dosyasındaki method isimleri, kullanıcı dosyalarındaki method isimlerinden farklı olmalıdır (show ile main_show_all gibi...).
  • Kullanıcı dosyalarında (admin.php, limited.php) ortak Controller sınıfının REQUIRE_ONCE ile çağrılmaldır.
  • Kullanıcı dosyalarında (admin.php, limited.php) ortak Controller sınıfının EXTEND edilmelidir.