RSS
 

Posts Tagged ‘PHP’

PHP Printing With LPR

13 Apr

Merhaba,

Son zamanlardaki yoğunluğumdan malesef pek makale yazacak zaman bulamıyorum. :) İnternette çok geyiği dönenen ve olmayacağına dair üzerinde sayfalarca tartışılan bir işlemi gerçekleştiricez şimdi. :)

Normalde sizinde bildiğiniz gibi PHP, ASP, Python v.s. gibi diller server-side çalışan ve bir interpreter’a ve/veya compiler’a bağlı olan dillerdir. Hal böyle oluncada O/S’a müdahelede kısıtlı oluyor. Sanırım PHP’yi geliştiren ekip bunuda düşünerek server üzerinde konsoldan komut çalıştırır gibi komut çalıştırabileceğimiz system(), exec() gibi bazı method’lar hazırlamışlar.

Bu makalenin konusu olan LPR(Line Printer Remote) protokolü de ismi üzerinde Line printing işlemi için hazırlanmış. Yani  komut satırından kod çalıştırarak yazıcılarımızı yönetebiliyoruz.
Madem PHP ile komut satırında kod çalıştırabiliyoruz ve LPR denen bir protokolde bize komut satırından yazıcıları yönetmemize izin veriyor. O zaman PHP ile direkt yazıcıdan çıktı alırız diyebiliriz. Hatta bir adım öteye giderek printer failover senoryalarına karşı object’ler yazıp CRON’lar ile sistemi otomatize edebiliriz, ki bu senoryayu ben daha önce gerçeklemiştim.

Windows tarafında Turn Windows features on or off(Windows Özelliklerini Aç veya Kapat) seçeneklerinden Print and Document Services(Yazdırma ve Döküman Servisleri) kısmından aşağıdaki servislerin yanındaki check işaretini checked yapmanız gerekiyor.

  • LPD Print Service
  • LPR Port Monitor

Linux (Ubuntu, Debian etc.) kısmı içinde aşağıdaki şekilde LPR’ı kurabilirsiniz.

sudo apt-get install lpr

Kurulum yaptıktan sonra ikisininde help dökümantasyonundan basitçe parametre sistemini çözebilirsiniz. Örneğin; Windows tarafı için bakarsak aşağıdaki şekilde bir ekran çıktısı olması gerekmektedir.

Windows 7 LPR CMD

Windows 7 x64 Enterprise Edition ENG kullanıyorum ve problemsiz çalışıyor.

Tabii Windows üzerinde LPR kurduğumuzda direkt çalışmıyor, virtual LPR printer oluşturup eklememiz gerekiyor. Bunun için internette bir sürü kaynak var fakat sizi uğraştırmak istemiyorum. :) Makale bütünlüğünü korumak adına aşağıda stepleri takip ederek kurabilirsiniz. Farklı bir kaynak istersenizde TechNET’teki şu link’e bakabilirsiniz: http://technet.microsoft.com/en-us/library/cc732063.aspx

Start->Control Panel->System and Security->Administrative Tools–|>Printer Management ‘a ulaştığımızda, Sol taraftaki menu list’ten Print Servers’ın altında kendi PC-Adınız’ı açın ve Ports kısmına tıklayın. Karşınıza aşağıdaki bir sayfa gelicek burada sağ tıklayıp Add Port demeniz gerekmektedir.

Windows 7 LPR Port

Bu aşamadan sonra karşınıza aşağıdaki gibi bir pencere çıkacak ve LPR Port’u seçip New Port demelisiniz. İlk alana IP’yi ikinci alana yazıcı kuyruk adını girmelisiniz.

Windows 7 LPR New Port

Bu aşamadan sonra Start->Devices and Printers kısmından yazıcılarınıza basit isimler vermelisiniz. Örneğin HP X1230 ML Express gibi bir isim varsa bunun yerine sadece HP veya HP1230 yazmanız komut satırından ulaşırken hata yapma şansınızı azaltacaktır.

Daha sonra yine sol taraftaki menüden Printers’ı seçip açılan sayfada boş bir yere sağ tıklayıp Add Printer dediğimizde karşımıza gelen pencereden Add a new printer using an existing port’u seçip sağ tarafındaki selectbox’tan daha önce oluşturduğumuz 10.70.1.99:queue1 portunu seçip Next diyelim. Daha sonra bu porttan erişeceği printer’ın driver’nı soracaktır. Bir sonraki adımda sizden yazıcı adını soracaktır, bu isme basit bir isim koymanızı öneririm. Çünkü komut satırına bu adı yazacağız.  Next/Next diyerek işlemleri bitirelim.

Şimdi Windows üzerinde Virtual LPR portu üzerinden erişilebilen bir yazıcımız oldu. Şimdi komut satırından LPR ile yazıcıya birşeyler gönderip test edelim. Yeni sanal yazıcı eklersen XEROX yazdığınızı varsayarsak komutunuz aşağıdaki şekilde olması gerekmektedir.

lpr -S 10.70.1.99 -P XEROX -d “Hello World”

Bu komut yazıcıya tahmin ettiğiniz gibi Hello World yazdırtacaktır. Bunun yerine bir hello_world.txt ‘de verebilirdik. O zamanda tahmin ettiğiniz gibi bu dosyanın içeriğini yazardı. Dosya ismi verirken o Path’te olduğunuza veya tam path yazdığınıza dikkat ediniz.

Şimdi sıra geldi sora PHP’den bu işlemi nasıl yapacağımıza;

Örnek senorya için fatura bastırmanız gerektiğini varsayalım. Eğer faturaların file şeklinde kayıtlı durmasını isterseniz ki önermiyorum, o zaman /invoice diye bir dizine pdf etc. tarzında kaydettikten sonra Fatura bastır dendiğinde tahmin ettiğiniz gibi system() veya exec() method’ları ile yukarıdaki LPR komutunu dinamik oluşturup gönderebilirsiniz. Komutun sonunda bulunan “Hello World” yerine $invoicePath gibi içerisinde faturanın full path’nin tutulduğu bir değişken gelmesi gerekmektedir.

Diğer bir durumda temp dizininde oluşturup yazdırma işlemi sonrası silmek en iyisi bence. Bunun içinde PHP’deki tempnam() methodunu kullanmamız gerekmektedir.

 <?php
        $invoice  = "Faturanın bilgileri/full path bu değişkende olacak.";
        $tmpFile = tempnam(sys_get_temp_dir(), "invoice_");
        system("lpr -S 10.70.1.99 -P XEROX -d $invoice", $returnArgs);
        unlink($tmpFile);
 ?>

Eğer HDD’e faturayı bastırmak istiyorsanızda 2. satırdaki $tmpFile’dan sonra fopen(), fwrite() ile dosyayı yazıp daha sonra dosyayı oluşturduğunuz path’ı system’deki LPR string’ne verip işlemi tamamlayabilirsiniz. Fakat bu seçenekte unlink() methodunu yorum satırına almayı veya kaldırmayı unutmayınız.

Çok fazla zamanım olmadığından fazla detaya inemedim bu makalede, ilk zaman bulduğumda güncelleyip. Cluster Printing, Failover etc kısımlarınıda nasıl gerçekleyeceğinizi açıklamaya çalışacağım.

İyi Çalışmalar.

 
1 Comment

Posted in PHP

 

Singleton Pattern

08 Apr

Merhaba Arkadaşlar,

Bu makalemde Creational desenlerden olan Singleton Pattern’ı inceleyeceğiz. Design Pattern’lar arasında en kolayı diyebiliriz.

Kısaca Tasarım Desenleri; Dünyanın farklı yerlerinde programcılar tarafından belirli bir soruna çözüm getirmek amacı ile oluşturulmuş yazılım kalıplarıdır. Dil bağımsızdır. Her hangi bir dilde yazılmış Design Pattern örneğini siz kendi kullandığınız dildede uygulayabilirsiniz.

Singleton Pattern ise object’mizin runtime da tekil olmasını sağlamaktadır. Bu da object’nin bir kere oluşturulup, istediğimiz kadar kullanmamızı sağlıyor. Böylece hem hız kazanıyoruz hem de memory alanından tasarruf etmiş oluyoruz. Data Access Layer’da uygulanabilir bir pattern’dır. Hemen bir örnek ile açıklayalım.

<?php
namespace Patterns{
	final class SingletonPattern{

		private static $object;

		private function __construct(){

		}
		public static function getObject(){
			if(!isset(self::$object)){
				$cls = __CLASS__;
				self::$object = new $cls;
				print("Oluşturdum!<br/>");
			}
			print("Zaten Vardım!<br/>");
			return self::$object;
		}
	}
}

namespace {

	$class  =& \Patterns\SingletonPattern::getObject();
	$class1 =& \Patterns\SingletonPattern::getObject();
	$class2 =& \Patterns\SingletonPattern::getObject();
	$class3 =& \Patterns\SingletonPattern::getObject();
	$class4 =& \Patterns\SingletonPattern::getObject();

	//$class = new \Patterns\SingletonPattern();
}
?>

Ben bir metoda bağlayarak çağırdım siz public static bir instance yaratıp bunun üzerindende nesneyi temsil edebilirsiniz. Nesnemiz new ile yaratılmasını önlemek içinde nesnenin construction(yapıcı metod)’nı private olarak değiştirdik. Böylece eğer yorum satırına aldığım kodu çalıştırmayı denerse biri FATAL ERROR dönecektir.

Kod çalıştığında 1 kez “Oluşturdum!” ve 4 kez “Zaten Vardım!” yazması gerekiyor. Buradanda şunu anlıyoruz 1 kere nesne oluşturulmuş ve diğer 4 nesne oluşturma girişimlerinde daha önceden oluşturulup RAM’e yüklenmiş olan object bize verildi.

Konu hakkında biraz daha bilgi isterseniz http://phpnedir.net/Page_singletonPattern.do buradaki kısa yazımı okuyabilirsiniz.

İyi Çalışmalar.

 

PHP NameSpace Kullanımı

22 Feb

Merhaba,

Bildiğiniz üzere PHP,  5.3.x versiyonundan itibaren NameSpace ‘i desteklemeye başlamıştı. PHP 6.x ile OOP adına bir çok şeyin yerine oturmasını bekliyorum ve PHP 6′yı sabırsızlıkla bekliyorum.

Öncelikle NameSpace’ler hakkında kısa bir bilgi verelim ve hemen örneklere geçelim. NameSpace yani İsim Alanları PHP’de benzer isimdeki class,constant ve function’ları aynı sayfa/proje içerisinde kullanmamızı sağlar ve daha okunabilir ve anlamlı object mimarileri kurmamızı sağlar. Windows File System olarak kafanızda canlandırabilirsiniz.

X:\ sürücü altına bir klasör oluşturup herşeyi bunun içine koyduğunuzu düşünün. İçindeki dosya sayısı 1.000′i geçtiğinde veya yaklaştığında, artık içinde bir şey bulmanız zorlaşacaktır. NameSpace’leri PC’ye uyarlarsak. A0023.jpg diye bir dosyanızın olduğunu varsayalım. Bu dosyayı X:\ sürücüsünün içindeki 10,000 dosya içerisinde aramak mı daha kolay? Yoksa X:\ sürüsünün altına X:\Photos\Summer\2009\A0023.jpg diye bir path’te bulmak mı? NameSpace’ler de bu şekilde kodlarımızı ayırmamızı sağlar. Yine WFS(Windows File System)’de olduğu gibi X:\Photos\Summer dizini altına  foo.txt diye bir dosya oluşturabileceğiniz gibi X:\Photos\Summer\2009 dizini altınada aynı isimde bir dosya oluşturanız WFS size karışmayacaktır.

Aynısını NameSpace’e göre açıklarsak; fooPage.php içerisinde  namespace spaceOne {  const fooC = 9; } ve namespace spaceTwo{ const fooC = 7; } diye yazdığımızda ikitane aynı isimde constant olmasına PHP kızmayacaktır. Çünkü farklı namespace’ler de bulunmaktalar. WFS’e göre farklı dizinler diye düşünebilirsiniz.

Şimdi örnek ile namespace kullanımını ve namespace içerisinde farklı bir namespace’i kullanmayı görelim;

<?php
/**
 * PHP | NameSpace
 * @author Hakan DAMAR
 * @link http://www.hakandamar.com
 */
declare(encoding="UTF-8");

namespace mainSpace{

 const conn_open = 1;
 class Connection{}
 function Connect(){}

}

namespace secondSpace{
	const conn_open = "Connected";
	class Connection{}
	function Connect(){}
}

namespace childSpace{
	use secondSpace as ss;
	function getConnectionStatus(){
		$conn_open = ss\conn_open . "!!!";
		return $conn_open;
	}
}

namespace {

	print(\mainSpace\conn_open."<br/>");
	print(\secondSpace\conn_open."<br/>");
	print(\childSpace\getConnectionStatus());

}
?>

Örnektende anlaşılacağı üzere namespace’ler namespace <nameSpace Adi> şeklinde tanımlanır. Peki, en altta isimsiz bir namespace var? O global namespace’dir.
İçerisinde hem diğer namespace’leri çağırabilirsiniz hem de normal PHP kodlarınızı yazmaya devam edebilirsiniz.
En üstteki declare() metodu object’in encoding’ini belirtmek için kullanılmaktadır. enconding haricindeki Diğer property’leri namespace kullanılan sayfalarda kullanılamaz!

Bir de childSpace’de use secondSpace ile seconSpace’i çağırdık ve as ss ile secondSpace ismini ss keyword’ne atadık. Değişken tanımlamak gibi düşünürsek $ss = “secondSpace”; dir.
Bundan dolayıda artık secondSpace’i ss temsil edecektir. Bu nedenle $conn_open variable’ın da secondSpace\conn_open yerine ss\conn_open kullanılmıştır.

NOT: namespace tanımı üzerinde declare(); metodu hariç hiç bir kod olamaz, aksi taktirde PHP Compiler ERROR dönecektir.

İyi Çalışmalar.

 
3 Comments

Posted in PHP

 

PHP Performans Testi

27 Sep

Merhaba,

İnternette dolaşan astronomik değerlerden sıkıldığımdan dolayı kendim güncel bir test yaptım. Yaptığım testlere göre sonuçlar aşağıdaki şekilde çıktı.

Testleri gerçekleştirdiğim makinenin konfigürasyonuna http://tinyurl.com/y8lkg5p buradan bakabilirsiniz.

Diğer Değerler;

  • Web Server: IIS 7.5
  • PHP Version: 5.2.10
  • Setup Mode: CGI/FastCGI
  • Browser: Firefox 3.5.2
  • OS: Windows 7 (x64)

Küçük boyutlu test sonucu;

8 Milyonluk bir döngü sonucunu: 0.98745512962341 saniyede getirdi.

Orta boyutlu test sonucu;

350 Milyonluk bir döngü sonucunu: 43.498991012573 saniyede getirdi.

Büyük boyutlu test sonucu;

1 Milyarlık bir döngü sonucunu: 123.0937769413 saniyede getirdi. (Ortalama 2 dk.)

Buda demek oluyor ki araya yazılımsal ve donanımsal caching + diğer performans yöntemleri ile büyük boyutlu bir sitemiz bile olsa hala rahatlıkla PHP’yi kullanabiliriz. :)

Genel Sonuç: print(“Yaşasın Open Source :D ”);

İyi Çalışmalar.

 
3 Comments

Posted in PHP

 

1.0 PHP ile Nesne Yönelimli Programlamaya Giriş

23 Sep

Merhaba,

Bu makalede PHP ile Object-oriented Programming(Nesne Yönelimli Programlama) giriş yapacağız. Makale giriş seviyesi fakat NYP(Nesne Yönelimli Programlama) ileri seviye bir konu olduğundan, PHP ile yeni web uygulamaları geliştirmeye başlayan kişilere tavsiye etmiyorum. Öncelikle PHP’de bir seviye uzmanlaşmakta fayda var. Yoksa bu makaleler zor ve öğrenmesi güç gelecektir.

Bilindiği üzere Class(Sınıf)’lar metodların birleşmesinden oluşur. PHP ile hazır gelen ve kendi oluşturabileceğimiz metodlar vardır. Bunlardan ilk iki tanesi __construct ve __destruct metodlarıdır.

__Construct Metodu; Object(Nesne) ilk yüklediği anda çalıştırılacak kodların bulunduğu bölümdür.  Daha önce ASP.NET ile web programlama yapmış arkadaşlar bunu Page_Load() methoduna benzetebilirler. PHP 4’te bu Class’ın adı ile aynı bir method oluşturarak mümkündü fakat PHP 5 ve sonrasında bunun yerine __construct() methodu getirildi.

void __construct ([ mixed $args [, $... ]] )

__Destruct Metodu; Bu metod ise nesne ile işimiz bittiğinde otomatik çağırılan metottur. İstersek manuel de çağırabiliriz.

void __destruct ( void )

Şimdi bu metodları bir örnek üzerinde inceleyelim.

Gördüğünüz gibi ilk önce __construct() metodu çalıştı ardından sayfa içerisindeki kodlar sonuna kadar çalıştırıldı ve en son olarak __destruct() metodu çağırıldı. Construction’da class içerisinde bolca kullanacağımız parametreler verilebilir. Destruction’da ise açık veri tabanı bağlantıları, session yok etme, hafızayı temizleme, arabelleği boşaltma v.b. gibi işlemler yapılabilir. Bunları ilerleyen makalelerde bolca kullanacağız. Bir class’ı new komutu ile oluşturacaksanız public olarak __construct metodunu kullanmalısınız. Fakat PHP’de __construct() ve __destruct() metodları olmadanda bir class oluşturmanız mümkündür.

__AutoLoad() metodu,  daha önce projelerimizde kullandığımız require_once() ve include_once() metodlarına benzemektedir. Fakat bunu class içerisinde otomatik yaparak bizi, acaba şu class’ı veya interface’i include(dahil etmek) ettim mi? Sorusundan kurtarır.  Bu metodu daha verimli kullanmak için class’larımızı ve interface(Arayüz)’lerimizi hiyerarşik yapıdaki bir klasörde tutmamızda fayda var. Anlatmak istediğimi bir örnek üzerinde inceleyerek pekiştirelim.

Klasör yapımız aşağıdaki şekilde olsun;

+ Proje

++ library

+++ testClass.php

+++ denemeClass.php

index.php

Metodumuzu aşağıdaki şekilde yazarsak Class’larımızı otomatik yükletebiliriz.

__autoload("test");

?>

Bu Class’ımız içerisinden çağırmak için kullanabileceğimiz bir yöntem. Fakat uygulamamız içerisinde, daha önceden hiç bir nesne oluşturmadan __autoload() adında bir fonksiyon yazarakta yapabiliriz. Gördüğünüz üzere yukarıdaki __autoload() metodunu çağırmak için new komutu ile önceden test() adında bir nesne oluşturuyoruz. Bunun yerine aşağıdaki şekilde bir fonksiyon ile de çözebiliriz.

Yukarıdaki fonksiyonu direkt olarak uygulamamızın içerisinde istediğimiz bir yerde, yeni bir nesne oluşturmadan __autoload(string <param>); şeklinde kullanabiliriz.

Not: __autoload() bloğu içerisinde oluşan hatalar catch bloğu ile yakalanamaz!

Erişim Hakları; Nesne içerisindeki bir değişkenin veya metodun nerelerden erişilebileceğini belirlememizde bize yardımcı olan komutlardır. Public, Private, Protected olarak 3 türü mevcuttur.

Public; Bu şekilde tanımlarsak heryerden erişilebilir olduğunu bildiririz. Eğer bir metodun başına hiç bir şey belirtmeden direkt tanımlarsak PHP bunu varsayılan olarak public(paylaşılan) olarak kabul eder. PHP 4’te public yerine kullandığımız var anahtar’ı geriye uyumluluk adına desteklenmektedir fakat PHP’nin 5.1.3 sürümünden önceki bir sürüm üzerinde uygulama geliştiriyorsanız bu E_STRICT uyarısına sebeb olur.

Private; Sadece tanımlanan Class(Sınıf) içerisinden erişilebilir.

Protected; Bu tür tanımlanan metod veya değişkenler sadece ilgili Class içerisinden veya türetilen Class içerisinden erişilebilir. Public gibi dışarıdan erişimi mümkün değildir.

Zend Studio gibi gelişmiş bir PHP IDE’si kullanıyorsanız zaten yeni bir nesne oluşturduğunuzda size Private ve Protected olarak tanımlanmış metod ve değişkenleri göstermeyecektir. Şimdi bunları bir örnek ile inceleyelim.

Zend Studio 7

Gördüğünüz gibi Zend Sutdio’da nesnemizi oluşturduğumuzda bize sadece public metod ve değişkenleri göstermektedir. Aksi taktirde uygulamamız Fatal Error(Ölümcül Hata) ile sonlanır.  Burada _getInfo() ismi ile tanımladığımız bilgi veren metodumuz biraz kafanızı karıştırabilir. Hani private ve protected metodlara dışarıdan erişilemezdi? gibi bir soru ortaya çıkabilir. Biz nesnemizdeki _getInfo() metodunu public olarak oluşturduk ve çağırdık. _getInfo() metoduda class içerisinde olduğundan yine class içerisindeki private,protected ve public değişkenlere erişme hakkı var. Yani biz metodu call(çağırmak) ediyoruz. O metod kendisi erişebildiği değişkenlerin değerlerini bize gösteriyor.

Protected erişim türünü daha iyi inceleyebilmek için, şimdi childClass() isminde yeni bir class oluşturarak bunu parentClass()’mızdan türetelim.

$degisken3 isimli değişkenin değerini burada override(ezmek) ederek değiştiriyoruz. Böylece artık $değişken3 türeyen class’ımızda atadığımız değere göre işlenecektir. Bu nedenle $foo2 nesnemizin _getInfo() metodunu çağırdığımızda ”Ben hem class içerisinden hemde türetilen class’lardan erişilebilirim.” değeri yerine “Değerini değiştirdik.”  yazısını göreceğiz. Hepimizin bildiği gibi başındaki br tag(etiket)’i HTML’e özel bir tag olduğundan tarayıcımız bunu yorumlayarak göstermemektedir. Bu nedenle çıktıda gözükmemektedir.

İyi Çalışmalar.

 
No Comments

Posted in PHP

 

PHP Type Güvenliği Fonksiyonu

13 Jun

Merhaba,

Bildiğiniz üzere PHP , C# gibi type güvenliği olan dillerden değildir. Değişkenler tipi belirtilmeden yaratılır ve ona göre kullanılır.  Peki tip güvenliği dedimiz olay nedir?

Tip güvenli bir değişken oluşturalım.

[C#]

int sayi = 1535;

float fSayi = 15.4;

string yazi = “Microsoft Windows 7″;

Tip güvenliği olmadan oluşturalım.

[PHP]

$sayi = 1535;

$fSayi = 14.45;

$yazi = “I lost control. :) ”;

Şimdi bu iki tanımlama arasındaki fark sizinde tahmin ettiğiniz gibi birisinde oluşturulan değişkenin tipi baştan belirtilerek oluşturuluyor böylece ileride kullandığımızda programımız her birini tipine uygun çalıştırıyor veya hata veriyor. Diğerinde ise tip belirtmeden bunu dilin kendisinin anlamasını tercih ediyoruz. Gerçi PHP 5.2.x sürümünden sonra bu ayrımı çok daha iyi yapıyor fakat büyük programlarda tür dönüşümleri ve değer tip değişikliklerinden çok büyük problemler çıkabilmektedir.

Peki PHP bunun için ne yapıyor? Tabii ki bir çözümümüz var. Yukarıdaki aynı tanımlamayı şu şekilde de yapabiliriz.

[PHP]

$sayi = (int)1535;

$fsayi = (double)14.45;

$yazi = (string)”I lost control”;

Böylece hem değişken tanımlamış hem de aynı zamanda bir convert işlemi ile değişkenlerin türlerini istediğimiz türe çevirdik. PHP ile değişken tanımlama seviyesinde yapabileceğimiz maximum budur diye tahmin ediyorum. Peki biz önemli projelerimizde bu tipleri nasıl kontrol edeceğiz. Büyük bir program geliştirdiğimizde, değişkenin nerelerden geçtiğini ve son değişken değerinin, bizim istediğimiz tipten olup olmadığını anlamak güçtür. Ayrietten bunu run time’da denetlemek daha da zordur. Çünkü, gelen veriler kullanıcılardan veya farklı 3. bir web servisinden olabilir. Bu nedenle bizim bunu program içinde denetlememiz gerekmektedir. Böylece runtime’da gelen datalar kontrol fonksiyonu tarafından denetlenerek olası problemler öngörülecektir.

İlgili fonksiyonu aşağıda veriyorum. Kendi class’larınıza ekleyebilirsiniz.

class foo {
	protected $type;
	/**
	 * Type Controller
	 *  @var any type
	 */
	public function typeControl($type) {
		$this->type = $type;
		is_string($type) ? $type = "String" : null;
		is_int($type) ? $type = "Int" : null;
		is_double($type) ? $type = "Double" : null;
		is_bool($type) ? $type = "Bool" : null;
		is_array($type) ? $type = "Array" : null;
		is_float($type) ? $type = "Float" : null;
		is_object($type) ? $type = "Object" : null;
		$type = "Bu değişken ".$type." türündendir.";
		return print $type;
	}
}
// Variables
$control = new foo();
$int = 3;
$str = "test";
$double = 7.9;
$bool = false;
$arr = array("Hakan",9,"Arda",7,"Atilla",3);
$object = new foo();

// Type Controller
$control->typeControl($bool);
$control->typeControl($double);
$control->typeControl($str);
$control->typeControl($int);
$control->typeControl($arr);
$control->typeControl($object);
?>

İyi Çalışmalar.

 
1 Comment

Posted in PHP

 

Basit Bir Spider Yazalım

21 Apr

Merhaba,
Biliyorum biraz uzun zaman oldu yazmayalı :) Ama bildiğiniz üzere CPU %100 çalışıyorum. Bu makalemde sizlere PHP ile nasıl basit bir spider yazabileceğinizi anlatacağım.

Her zaman ki gibi PHP bunun içinde bizi düşünmüş ve get_meta_tags adında bir function yazmış. Bu fonksiyon bize meta taglarındaki attribute’leri bir dizi olarak dönmektedir.  Şimdi bunun için bir class yazmamı beklemeyin.  OOP’in de suyunu çıkartmayalım. Herşey için bir class olmaz. :) Bunun için bir function yazacağım. Hemen kodlamaya başlayalım.


Unutmadan her tag her sitede olacak diye bir şart yok. Bu yüzden bazı alanların null gelmesi yüksek ihtimal bu yüzden eğer araya database koyacaksanız is_null() function’nı kullanmayı unutmayınız. Bunun dışında farklı dillerdeki sayfalarda karakter seti problemi yaşabilirsiniz. Onun içinde mb_detect_encoding function’nından yararlanabilirsiniz.

Sorularınız olursa ki Spider işleri ile uğraşıyorsanız kesin olur. Bekliyorum. Son olarak eğer arama motoru veya benzer bir yapı ile uğraşıyorsanız regex(regular expression) üzerine biraz kafa yormanızı tavsiye ederim. Gözüktüğü kadar zor değildir.

İyi Çalışmalar.

 
1 Comment

Posted in PHP

 

PHP’de Merkezileştirme (OOP)

09 Apr

Merhaba arkadaşlar,

Bildiğiniz üzere PHP artık bir çok görevi başarıyla yerine getirebilir seviyeye gelmiştir. Bu nedenlede PHP artık Web sayfalarından Web uygulamalarına geçişte önemli bir yerde durmaktadır.

Merkezileştirme derken anlatmak istediğim web uygulamalarımızda bütün bir uygulama üzerinde gerekli olan ve kullanılan ihtiyaçlarınızı bir pipeline’dan geçirerek bağımsızlaştırmaktır.Yaptığımız bir nevi DAL’dır aslında.[Data Access Layer(Veri Erişim Katmanı)] Nasıl olacak sorusunun cevabını beraberce arayalım.
Örnek senaryo üzerinden daha iyi anlatabileceğimi düşündüğümden, bir örnek ile açıklayayım.

Basit bir contact manager yazmamız gerektiğini düşünelim. Bu tür uygulamalar veri işleme üzerine kurulduğundan tüm verilerin doğru ve kontrollü şekilde ilerlemesi gerekmektedir. Veri tabanı olarak ne kullanırsanız kullanın mutlaka önemli alanlar için Transaction yönetimi yapmayı unutmayın. Konumuz veri tabanları olmadığından bu konuya girmiyorum. İlerleyen makalelerim de bu konuyuda ayrıntılı şekilde anlatacağım. Şimdilik devam edelim. Diyelim ki veri tabanı olarak MySQL Server’ı seçtik. İşimiz aslında her developer’ın da yaptığı gibi database programming. Biz yazılım ile uğraştığımızı sanıyoruz ama yaptığımız 10 projeden 7/8′i veri tabanı programlamadır. :) Şimdi object-oriented şekilde nasıl uygulamamızı merkezileştireceğimize bakalım.

Bu uygulamada veri tabanı kullanacağımızdan mutlaka veri tabanına sorgu göndereceğiz. Demin söylediğimi hatırlarsak uygulamamızın bütününde bize gereken şeyleri bir yerde toplayacaktık ve yönetimini kolaylaştıracaktık. Şimdi biz SQL sorgularımızı bir yerden geçecek şekilde hazırlıyoruz ve daha sonra sağladığı kolaylığı inceleyeceğiz.

dbType = $Type;
		$this->dbConn = $Connection;

	}

	public function Query($ExecQuery){
		$this->sqlQuery = $ExecQuery;
	}
	switch ($this->dbType){
		case "MySQL":
		// Transaction için Table Engine Type InnoDB olmalıdır.
		@mysql_query("BEGIN");
		// Eğer birden fazla veri tabanı ile çaışıyorsanız!
		// mysql_query() fonksiyonuna 2. parametreyi veriniz.
		# $executeQuery = mysql_query($ExecQuery,$this->dbConn);
		$executeQuery = mysql_query($ExecQuery);

               if ($executeQuery){
		    @mysql_query("COMMIT");
		    // Sorgu Başarılı
		}else{
		   @mysql_query("ROLLBACK");
		   // Sorgu BAŞARISIZ!!!
		}
		break;
		case "MsSQL":
			// Ms SQL Server code here… etc…
		break;
		case "Oracle":
			// Oracle Connection here.. etc..
		break;
		case "PostgreSQL":
			// PostgreSQL connection and execute sql query code here.
		break;
		default:
			die("Bu veri tabanı henüz desteklenmiyor.
			Şimdilik: MySQL,MsSQL,Oracle,PostgreSQL desteklenmektedir.");
			exit();
	}
  }
}

/**
* İlgili Sayfanıza require_once() ederek
* aşağıdaki şekilde kullanabilirsiniz.
*/
// Nesnemizi Oluşturduk.
$DAL = new DBProvider();
//Veri Tabanı Türümüzü ve Bağlantımızı Belirttik.
$DAL->Provider("MySQL",$DB->Connection);
//SQL Sorgumuzu Çalıştırdık.
$DAL->Query("SELECT count(*) as TotalUser FROM tbl_user ORDER BY UName DESC");
?>

Yukarıdaki kod bize sorgularımızı merkezi tek bir noktadan kontrol etme imkanı verdi. Bizde Transaction yaparak işlem bütünlüğünü sağladık. Bu ders olmadığından diğer tüm özelliklerini de yazmadım. Sadece mantığını anlatmak adına bir kısmını yazdım. Siz bunu geliştirmek adına ekstra olarak bir string temizleme function’ı yazarak gelen sorgularınızı çalıştırmadan önce temizleyebilirsiniz.

Kod’da $DB->Connection(); diye bir parça var. Bu bölümü kodun içerisinde göremiyorsunuz çünkü DB Class’ı da ayrı bir parçasıdır programın. DB Class’ını yazdıktan sonra bağlantı parametrelerini alan Connection isminde bir function ile bu kodu tamamlayabilirsiniz. Tavsiyem Connection() bool bir değer dönsünki Connection State yapmak istediğinizde bunu if gibi karak kontrol mekanizmalarında kullanabilin. İleri de DAL’da yazacağımızdan bu konuya girmiyorum. Çünkü kendisi başlı başına bir konudur. :)

Burada değinmek istediğim ikinci nokta ise Query function’nın içerisinde gördüğünüz Switch döngüsüdür. Bu döngü ile (şimdilik DAL’ı bilmediğimizden) veri tabanı bağımsız şekilde uygulamamızı geliştirmeye devam edebiliriz. Olduda bir gün artık uygulamanızı Ms SQL Server’a geçirmek isterseniz tek yapmanız gereken Provider Function’na set ettiğiniz Type parametresini MsSQL olarak değiştirmektir. Gerekli ayarları yaptıktan sonra artık uygulamanız Ms SQL Server üzerinde başarılı bir şekilde çalışıyor olacaktır.

Gördüğünüz gibi OOP(Nesne tabanlı programlama) ile web uygulamaları geliştirdiğimizde bir sayfaya database connection sağlayıp, güvenli sorgular çalıştırmak için yazacağımız kod satırı 3′ü geçmemektedir. Ayrietten Uygulamalarınızdaki bazı noktaları merkezileştirerek uygulamamızı nasıl bağımsız hale getireceğimizide gördük.

Saygılarımla,

Hakan DAMAR

 
No Comments

Posted in PHP

 

PHP İle Tüm Cookie’leri Silme

09 Apr

Merhaba,

Oxijen Framework’ün parça, parça işinize yarayabilecek kısımlarını function olarak sizlerle paylaşıyorum.

<?php
// Remove All Cookie
foreach ($_COOKIE as $k => $v){
	setcookie($k,"",time()-3600,"/",".hakandamar.com");
}
?>

Bu kod $_COOKIE super global üzerinde dönerek içerisindeki tüm key’leri alıyor daha sonra null’a set ederek boşaltıyor ve geçerlilik süresini bitiriyor.

İyi Çalışmalar.

 
4 Comments

Posted in PHP

 

PHP ve MsSQL Server 2008 İle Hızlı Uygulamalar

15 Mar

Merhaba,

Bu yazımda sizlere Microsoft’un değişen open source vizyonu ve PHP denildiğinde akla gelen MySQL veri tabanının yavaş,yavaş yıkılmaya doğru ilerlediğinden bahsedeceğim. Bildiğiniz üzere kısa bir süre önce MySQL Sun Microsystems tarafından 1 milyar dolar’a satın alınmıştı. Bunun ardından herkesin aklında oluşan acaba MySQL ücretli olacak mı? sorusunun cevabını henüz alamadık ama zaten MySQL Server Enterprise Edition ücretli.

Şimdi hazır konu ücretlere değinmişken şu Microsoft’un ürünlerine gelelim. Burada konu olan MsSQL Server ailesi bilindiği üzere ücretlidir. Fakat Express Edition olarak ücretsiz sürümleride mevcut. Yanlış hatırlamıyorsam bu sürümü 4GB  db stroge alanı ile sınırlandırılmıştı. Şimdi birde konuya şu açıdan bakın. Profesyonel bir kadronun yıllarca emek sarf ettiği bir yazılımı alarak kendiniz uygulamalar geliştirmek istiyorsunuz. Fakat siz uygulamalarınızı geliştirip satarak para kazanırken. Microsoft ücretle satıyor diye tepki gösteriyorsunuz. Üstelik ücretsiz bir sürümünüde size sunduğu halde. Şimdi diyeceksiniz ki onun alan sınırı var. Doğru var ama 4GB’lık bir veri tabanına ulaştıysanız zaten siz bu uygulamadan veya siteden kar elde ediyorsunuzdur ve artık bir üst sürümünü almanın zamanı gelmiştir. Biraz bireyselden uzaklaşıp kurumsal uygulama geliştirme tarafına geçecek olursak. Bu sınır firmalar için yetmeyebilir. Peki bu durumda ne yapacağız? Tabii ki bunu Microsoft’ta düşünmüş ve Developer Edition diye bir sürüm çıkartmış. Üstelik Microsoft SQL Server 2008 Developer Edition’ın fiyatı sadece 50$(dolar). Evet, yanlış okumadınız.  Şimdi burada MySQL v.s. MsSQL yapmayacağım şuan için MsSQL Server 2o08 karşılaştırma yapılamayacak kadar farklarla zaten liderlik tahtından inmeyecek gibi duruyor. Birde bildiğiniz üzere IIS 7.0 üzerine PHP’yi FastCGI modülu olarak kurarsanız Apache server’dan %70 daha hızlı çalışmaktadır. Bunu da yanlış okumadınız. :)   Üstelik Microsoft bunlarlada kalmayarak Windows Server’lar için optimize edilmiş özel PHP sürümlerinide oluşturmaya başladı. http://windows.php.net adresi altından bu sürümlere ulaşabilirsiniz.  IIS tarafındaki FastCGI ile ilgili bilgi almak istersenizde http://www.iis.net/php adresinden bilgi edinebilirsiniz. Şimdi bu bilgileride yanımıza alarak yazımıza devam edelim.

Kısa bir süre önce duyurulan Microsoft MsSQL Server 2005 Driver For PHP diye bir PHP eklentisini Microsoft kullanıcılara sunmuş ve şimdiye kadar pek görmeye alışık olmadığımız PHP ile ilgili makalelerini MSDN’e eklemiş bulunmaktadır. SQL Server 2005/2008 Driver ile ilgili açıklamayı ve anlatımı daha sonraki teknik makalemde yapacağım. Geçen gün IIS 7.0 üzerine FastCGI olarak kurduğun PHP 5 ve MsSQL Server 2008 ile yaptığım bazı testler beni bu yazıyı yazmaya iten en büyük sebeblerden biridir. Hız farkı gerçekten tahmin ettiğimin çok üzerinde çıkarak beni şaşırttı ve artık dedim ki PHP ile MySQL yerine çok güçlü bir kullanıcı arayüzü sunan MsSQL Server’ı kullanmanın zamanı geldi. Üstelik iletişim v.s. gibi problemlerde yaşayacağınızı sanmıyorum. PHP kurulumunuza Microsoft’un sunduğu SQL Server Driver’ı kurarak bunun üzerinden çalışırsanız çok rahat MySQL ile yaptığınız işlemlerinizi gerçekleştirebilirsiniz. Tabi size sağladığı sadece performans değil. Tür güvenliği ve işlem bütünlüğünden daha sayamayacağım bir çok konuya kadar destek veren MsSQL Server 2008 gerçekten denemeniz gereken bir veri tabanı eğer ilk defa kuracaksanız size biraz karmaşık gelebilir fakat biraz öğrendikten sonra vazgeçebileceğinizi sanmıyorum.

Silverlight ile yapılmış Türkçe çok güzel bir siteside mevcut. http://www.sqlenerji.com adresinden özelliklerini inceleyebilir,indirebilir veya daha ayrıntılı bilgi alabilirsiniz.

Saygılarımla.

 
No Comments

Posted in PHP