ASP.NET C# C/C++ Genel HTML/CSS Java JS/Ajax PHP XML Forum

Memcached ile Sitenize Hız Katın

Memcached ile Sitenize Hız Katın

En son üzerinde çalıştığınız PHP/MySQL projenizi nihayet yayınladınız. Bu çok iyi. Fakat projenizin çok fazla SQL sorguları çalıştırdığından sizin beklediğiniz gibi hızlı olmadı. Bundan dolayı bu aşırı yüklenmelerin altından kalkamayacağınızı düşünmeye başladınız. Bu konuda da büyük ihtimalle haklısınız.

Bu makalede, web sitenizin hızını nasıl muhteşem bir şekilde artırabileceğinizi göstereceğim. Ayrıca bu aşırı yüklenme derdinizi ortadan kaldıracağım. Kodlarınızla veritabanınız arasına bir önbellek katmanı koyarak veritabanınızı biraz arka plana atacağız hep beraber.

Memcached'e Giriş
Modern web siteleri ve web uygulama çok fazla miktarda veriyi kullanır ve artık tek sayfada 20 ve hatta 30 SQL sorgusu alışıldık bir durum halini aldı. Bu rakamı çok fazla ziyaretçi bulunan bir web sitesi için gereken sayı ile çarpın, sayfaların oluşturulması saniyeler alabilir ve sonra kullanıcıya gönderilir.

Performansımızı artırmak için kullanacağımız aracın adı Memcached. Bu yüksek performanslı bir önbellekleme sistemidir. Memcached'den aşağıdaki durumlarda bize yardımcı olmasını isteyeceğiz:
- V değerini K anahtarı ile sakla
- K anahtarlı V değerini getir

Memcached'i modern Linux dağıtımlarına kurmak için aşağıdaki komutlar işimizi görecektir:
Ubuntu : sudo apt-get install memcached
Gentoo : sudo emerge install memcached
Redhat : sudo yum install memcached

Kurulduktan sonra sunucu her yeniden başlatıldığında Memcached'de otomatik olarak başlatılacaktır. Memcached için ayrılan hafızayı ve bir kaç özelliği daha ayar dosyasından(/etc/memcached.conf) değiştirebilirsiniz. 64Mb varsayılan olarak ayrılan hafızadır. Ayrıca bu ayar dosyasında Memcached'in bağlı olduğu IP adresini ve portu görebilirsiniz. Varsayılan değerler(127.0.0.1 ve 11211) standart bir kurulum için ideal değerlerdir.

Memcached'e PHP ile Erişim
PHP scriptlerinizde verileri saklamak ve onlara erişmek istiyoruz. Bu da Memcached'e PHP ile erişmemiz gerekiği anlamına geliyor. Bu nedenle PHP'nin "Memcached" eklentisini kuracağız. Aslında bu da bir PECL eklentisidir. Kaldıki PECL eklentilerinin kurulumu çok basittir, ihtiyacımız olan eklentiyi aşağıdaki komut ile kurabilirsiniz:

sudo pecl install memcache

PHP'de Memcache ile ilgili iki eklenti mevcut: "Memcache" ve "Memcached"(Sondaki "d" harfine dikkat edin). Bu ikisi birbirine oldukça benzerler fakat küçük farklılıkları var. Bu makalede basit olan Memcache'i kullanacağız. Kurulum bittikten sonra eklenti aktif olacak ve Memcache ile ilgili fonksiyonları PHP scriptlerimizde kullanabilir olacağız.

Memcached ile önbelleklediğimiz verileri sadece SQL sorgularından "Insert" ve "Update" komutlarını kullandığımız zaman güncellememiz gerekecek. Onun dışında önbelleklediğimiz verileri güncellememize gerek yoktur. Her yeni girdi de ve güncellemede hem MySQL hemde Memcached'i güncelleyeceğiz. Fakat veriyi okurken sadece Memcached'i kullanacağız. MySQL kullanmamıza gerek kalmayacak. Eğer Memcached'de bir hata ile karşılaşırsak MySQL'i kullanacağız.

Öncelike scriptimizin en üstünde bir memcached'e giden bir bağlantı oluşturmalıyız:

// Bağlantı sabitleri
define('MEMCACHED_HOST', '127.0.0.1');
define('MEMCACHED_PORT', '11211');
 
// Bağlantı
$memcache = new Memcache;
$uygunMu = $memcache->connect(MEMCACHED_HOST, MEMCACHED_PORT);

Bu işlemle Memcache sunucusu ile bağlantı kurmuş olduk. Başarısız olabilir fakat başarısız bile olsa $uygunMu değişkeni sayesinde biz bunu öğrenebileceğiz.

Veriyi Önbellekleme
Artık verilerimizi yedeklemenin vakti geldi. Şimdi bir örnek yapalım. Bir sanal mağazanın ürün düzenleme sayfasını düzenleyelim. Bu mağazada her ürün sadece aşağıdaki bilgileri içeriyor:
- id
- ad
- açıklama
- fiyat

Ürün düzenleme sayfasında illaki INSERT veya UPDATE SQL komutları kullanılıyordur. Şimdi varsayalım ki bu sayfa da INSERT ile ürün ekleyeceğiz. Aşağıdaki kodda ürünü MySQL ekliyoruz. Eğer ekleme işlemi başarılı olursa product_xx anahtarları ile X dizisini değerleriyle birlikte önbellekte saklıyoruz. İşte kod:

// Değişkenleri bütün kontrollerden geçirdikten sonra vt'ye girelim
$sql = "INSERT INTO urunler (id, ad, aciklama, fiyat) VALUES ($id, '$ad', '$aciklama', $fiyat)";
$basari= mysql_query($sql, $db);
 
// Verilerimizi vt'ye kayıt ettik.
// Şimdi bu verileri önbelleğe kaydedelim
if ($basari=== true)
{
   // Bu ürün için benzersiz bir anahtar belirleyelim
   $anahtar = 'urun' . $id;
 
   // Şimdi de bu ürünün verilerini dizide toplayalım
   $urun = array('id' => $id, 'ad' => $ad, 'aciklama' => $aciklama, 'fiyat' => $fiyat);
 
   // Önbellekleyelim
   $memcache->set($anahtar, $urun);
}

Şimdi önbellekleme işlemini tamamlamış olduk. Unutmayın sadece SQL Insert ve Update komutlarında önbellekleme yapmanız yeterli olacaktır.

Önbellekten Veri Çekme
Eğer önbellek uygun değilse yani herhangi bir durumda çalışmazsa bu durumda tekrar MySQL'den verilerinizi çekebilirsiniz. Kısacası Memcached kullanmanızın size hiç bir zararı olmayacaktır. Hemen veri çekerken nasıl kullanacağımızı göstermek istiyorum. Diyelim ki önceki girdiğimiz üründe ürün id'si 12'ydi. Şimdide urun.php?id=12 sayfasına girdik:

$id = $_GET['id'];
// $urun değişkenimizi tanımlayalım
$urun = null;

// Öncelikle önbellek sunucumuz uygun mu deği mi? Onu kontrol edelim
// $uygunMu değişkeni sayfalarımızın en üstünde önbellek sunucuna bağlandığımız değişkendi
if ($uygunMu== true)
{
   // Şimdi daha önce bu ürün için belirlediğimiz anahtarı tanımladık burada
   $anahtar = 'urun' . $id;
 
   // Şimdi önbellek sunucumuzdan verileri çekelim
   $urun = $memcache->get($anahtar);
   // Dizi olarak önbelleklemiştik. Dizi olarak çıktımızı aldık,
   // $urun['id'], $urun['ad'], $urun['aciklama'], $urun['fiyat']
}
 
// $urun = $memcache->get($anahtar) işlemi başarısız olursa
// hemen MySQL sorgusu burada devreye girer. Fakat başarısız olmasını gerektirecek
// bir durum genellikle gerçekleşmez
if (!$urun)
{
   // Burada mysql_fetch_assoc() ile veritabanından çekersiniz bilgilerinizi
}

Kısacası web sitesini hızlandırmak isteyen herkesin rahatlıkla kullanabileceği bir sistem. Kurulumu basit, kullanımı basit. Sitenize adapte etme kısmı biraz işkenceli olabilir. Onu da hemen halledeceğinize inancım sonsuz.

Faydalı olduğuna inanıyorum, umarım iyi bir anlatım olmuştur,
Kolay gelsin,




PHP ile Magento'da Bir Grup Ürünü Sepete Ekleme

PHP ile Magento'da Bir Grup Ürünü Sepete Ekleme

Merhaba arkadaşlar,

Magento'da basit ürünleri(simple prodcut) sepete atmanızı sağlayacak PHP kodu oldukça basittir. Tek ihtiyacınız olan '$cart->addProduct()' fonksiyonudur. Bu fonksiyonla beraber ürün id ve miktarını da gönderirsiniz. Fakat grup ürünlerin sepete atılması biraz farklıdır.

Öncelikle grup ürün nedir diyenlerin sorularını cevaplandıralım. Grup ürün olarak bir ürün açarsınız ve ürüne farklı ürünler bağlarsınız. Bağlayacağınız ürünler daha önce basit olarak girilmiş ürünlerdir. "Ekran Kartları" diye bir grup ürün seçersiniz ve buna "A ekran kartı" ve "B ekran kartı" ürünlerini bağlarsınız. Müşterilerini "Ekran Kartları" ürünüe girdiği zaman bu iki üründen bir tanesini veya ikisini aynı anda dilediği miktarda sipariş edebilir. Daha detaylı bilgi isterseniz kendiniz bir grup ürün ekleyip buna bir kaç ürünü bağlarsınız ve sitenizde kontrol edebilirsiniz.

Grup ürünleri sepete ekleme işlemi de oldukça basit bir işlemdir aslında. Bunun için bir $super_grup isimli bir dizi oluşturacağız ve bu dizide bağlanan ürünlerden satın alınmak istenilenleri ve miktarlarını addProduct() fonksiyonu ile işleyeceğiz. Bunun için aşağıdaki kodu kullanacağız:

<?php
// İlgili ürünleri tutmamızı sağlayacak dizi
$super_grup = array();

// Grup ürünün id'si
$grup_urun_id = <grup_urun_id>;

// Bu grup urunde bağlanan urunlerden bizim sepete ekleteceklerimiz
$bagli_urunler = array('<bagli_urun_id_1>','<bagli_urun_id_2','<bagli_urun_id_3');
// Bu grup üründe yedi tane bağlı ürün var fakat biz üç tanesi seçtik ;) Yani isteğe göre <bagli_urun_id_4> vs. ekleyebilirdik

// Her bağlı ürün için ikişer tane sepete atalım
$adet = 2;

// Sepete atılacak bağlı ürünleri $super_grup dizisine atalım ve ürün id'lerini de dizi anahtarı olarak belirleyelim ve karşılarına da miktarlarını yazalım
foreach($bagli_urunler as $bagli_urun){
 if(intval($bagli_urun)){
   $super_grup[$bagli_urun] = $adet;
 }
}

//Add Grouped product to cart
try {
 // Grup ürün bilgileri çekmek için gerekli nesneyi yükleyelim
 $urun = Mage::getModel('catalog/product')->load($grup_urun_id);
 
 // Ürün uygun mu kontrol edelim
 if (!$urun) {
  echo "Hata ile karşılaşıldı!";
  return;
 }

 // Sepet nesnesini çağıralım
 $sepet = Mage::getModel('checkout/cart');

 // Grup ürün için parametreleri alalım
 $parametreler = array('super_group' => $super_grup);

 // Ürünleri belirlediğimiz parametrelerle sepete atalım ve kaydedelim
 $sepet->addProduct($urun, $parametreler)->save();

 Mage::getSingleton('checkout/session')->setCartWasUpdated(true);
  
 echo $this->__('%s sepetinize eklendi.', Mage::helper('core')->htmlEscape($urun->getName()));

}
catch (Mage_Core_Exception $e){
 if (Mage::getSingleton('checkout/session')->getUseNotice(true)){
  echo $this->__($e->getMessage());
 }
 else{
  $messages = array_unique(explode("n", $e->getMessage()));
  foreach ($messages as $message) {
   echo "<br />".$message;
  }
 }
}
catch (Exception $e){
 echo $this->__('Ürünü sepete ekleyemezsiniz.');
}
?>

Yukarıdaki kodda nerede ne yaptığımızı açıkladım. Umarım işinize yarar,
Kolay gelsin



PHP'de Session Yazma Hatası

PHP'de Session Yazma Hatası

Merhaba arkadaşlar,

Bugün karşılaştığım bir hatayı ve bunun çözümünü sizlerle paylaşacağım..

Durduk yere error_log dosyamda aşağıdaki hatayı almaya başladım:
PHP Warning: Unknown: open(/var/lib/php/session/sess_57a2e1be3b736579c5af4f9f4acd43f3, O_RDWR) failed: Permission denied (13) in Unknown on line 0, referer: http://xxx.com
PHP Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in Unknown on line 0, referer: http://xxx.com

Nedenini bilmiyorum bir anda bu hata ortaya çıktı. Bugün bir eklenti kurdum belki de ondandır.. Biraz araştırmalarım sonunda iki satırlık komut ile bu sorunu çözebileceğimi farkettim. Bu sorunu yaşayan arkadaşlar için çözüm aşağıdaki gibi olabilir:

chown apache /var/lib/php/session
chmod 777 /var/lib/php/session

Bu şekilde tekrar eski haline geliyor ve düzeliyor fakat session klasörünün izinleri çok fazla. Herkesin rahatça erişebileceği bir halde. Daha sonra biraz daha araştırdım ve varsayılan klasör izinlerini elde ettim. O da çalışıyor. Yani kullanmanızı tavsiye ettiğim klasör izinleri için gerekli komut aşağıdaki gibidir:

chown root:psacln /var/lib/php/session
chmod 770 /var/lib/php/session

Benim tercihim ikincisini kullanmaktan yanadır. Siz hangisini uygun bulursanız onu kullanabilirsiniz. Umarım işinize yarar.

Kolay gelsin, 



<alt:a> Formatındaki XML'i PHP ile Okuma

<alt:a> Formatındaki XML'i PHP ile Okuma

Merhaba arkadaşlar,

Bugün forumlarda bir soruyla karşılaştım. Bunu ve çözümünü sizlerle paylaşmak istedim. Neyse, konuyu uzatmayalım. Şimdi daha önce

<a>
    <b>tr</b>
    <c>kodlama</c>
</a>

Formatındaki XML'i nasıl PHP işleyeceğimizi http://www.trkodlama.com/php-ile-xml-dosya-dan-veri-cekme-310.html bu makalede anlatmıştım. Bu sefer mevcut XML yapımız biraz daha farklı... Aşağıdaki gibi bir XML(icerik.xml olsun) yapımız olduğunda PHP kodumuz nasıl olacak onu görelim:

<eleman-info>
   <id>AAAAAAA</id>
   <aid>1111111</aid>
   <ce:a>ornek1</ce:a>
   <ce:b>ornek2</ce:b>
</eleman-info>

Burada kafamızı karıştıran nokta eleman-info etiketindeki "-" işareti ve ce:a ve ce:b etiketleri.. Bunları PHP SimpleXML ile aşağıdaki şekilde kolaylıkla işleyebiliriz:

<?php
header("Content-Type: text/html; charset=utf8"); // Karakter problemi için gerekli
$a=simplexml_load_file("icerik.xml"); // içerik.xml dosyamızı çekelim

// AAAAAAA kısmını çeken kod:
echo $xml->{'eleman-info'}->id;

// 1111111 kısmını çeken kod:
echo $xml->{'eleman-info'}->aid;

// ornek1 kısmını çeken kod:
echo $xml->{'eleman-info'}->children("ce",true)->{'a'}; 

// ornek2 kısmını çeken kod:
echo $xml->{'eleman-info'}->children("ce",true)->{'b'}; 
?>

eleman-info altındaki ce:a ve ce:b'yi çekmek için SimpleXML'i yukarıda gördüğünüz gibi kullanıyoruz. Bu makaleyi yazmama vesile olan un.real ve grk3mm takma isimli arkadaşlara teşekkür ederim.

Kolay gelsin,



PHP Projelerinizdeki Türkçe Karakter Problemi

PHP Projelerinizdeki Türkçe Karakter Problemi

Merhaba arkadaşlar,

Uzun zamandır makale yazamıyordum. Bugün yeni makaleme başladım türkçe karakter probleminin çözümünü projeme eklemeyi unuttuğumdan dolayı bende türkçe karakter problemi yaşadım.. Şükür ki çözümü biliyordum. Sizlere bugün bu problemin çözümünü anlatıyorum..

Türkçe karakter çözümünün temelinde karakter setinizi UTF-8 olarak ayarlamak yatıyor..

Projelerinize bir kaç satırlık kodu eklemezseniz "ü,ı,ğ,ö,ç,ş" gibi harflerin yerine "�" gibi bir sembol çıkar. Çözümü çok basittir. Projelerinizde bir tane ayar dosyanız vardır ve bu dosyayı bütün dosylarınıza include edersiniz.. Bunu yapmıyorsanız da yapmanızı tavsiye ederim. Bu ayar dosyanızın en üstüne aşağıdaki kodu ekleyin:

header("Content-type: text/html; charset=utf-8");

Bundan sonra bir işlemimiz daha kaldı. Veritabanına bağlandığımızda girdileri UTF-8 olarak almamızı sağlayacak SQL kodlarını çalıştırmamız gerekiyor.

mysql_select_db("db_adi"); // Veritabanımızı seçtikten sonra aşağıdaki kodları ekliyoruz
mysql_query("SET NAMES 'utf8' COLLATE 'utf8_turkish_ci'");
mysql_query("SET CHARACTER SET utf8");
mysql_query("SET COLLATION_CONNECTION = 'utf8_turkish_ci'");

Bu işlemlerden sonra dosyalarınızı UTF-8 formatında kaydetmeyi unutmayın..

Kolay gelsin,



Kalıcı MySQL Bağlantısı

Kalıcı MySQL Bağlantısı

Sevgili TR Kodlama Ziyaretçileri,

Bu makalemde yoğun trafiğe sahip web sitelerinin kullanmasını tavsiye ettiğim bir php fonksiyonunu anlatacağım sizlere. Bu fonksiyon sunucuları büyük bir zahmetten kurtaracaktır. Bu vesile ile sunucularınızda çıkan sorunlarıda azaltacağından sizleri de rahatlatacaktır.

Bu fonksiyonun adı mysql_pconnect()'dir. Bu fonksiyonun kulanım şekli mysql_connect() ile aynıdır.

<?php
$baglanti = mysql_pconnect($vt_sunucusu, $vt_kullanici_adi, $vt_kullanici_sifresi);
?>

Bu fonksiyonun fark açık kalmasıdır. Bildiğiniz gibi mysql_connect fonksiyonunu her yeni sayfa geçişinde kullanmak durumundayız fakat bu fonksiyonla bağlantı bir kere açılır. Yani bir kullanıcı sitenize gelir mysql_pconnect ile sunucuya bağlanılır ve kullanıcı her sayfa gezdiğinde yeni bir mysql bağlantısı açılmaz. Yani apache sayfa PHP'nizi yorumladıktan sonra mysql sunucunuz kapatılmaz. Bir sonraki sayfada da tekrar açılmaz. Kalıcı bağlantılar kalıcı olmayan bağlantılardan fazla bir özelliğe sahip değildirler.

Kalıcı bağlantılar ek bir işlevselliğe sahip değilseler bunlar neden tercih ediliyorlar, diye soranlar olabilir. Yanıtı oldukça basittir: Verimlilik. SQL sunucunuza bağlantı açmak çok masraflıysa kalıcı bağlantılar kurmak daha iyidir. Bu bedel gerçekte birçok sebebe bağlı olabileceği gibi olmayabilir de. Bu, veritabanının, HTTP sunucunun bulunduğu makinede olup olmamasından SQL sunucusunun makineye ne kadar yük bindirdiğine kadar geniş bir yelpazede değerlendirilebilir. Son değerlendirmede, eğer bu bedel yüksekse kalıcı bağlantıların büyük ölçüde yardımı olacaktır. SQL sunucuya yapılan her bağlantı isteğinde alt süreç sadece o sayfayı işleyeceği yerde, kalıcı bağlantı durumunda her alt sürecin ömrü boyunca bir bağlantı kurmasına olanak tanınır. Yani, bir kalıcı bağlantı açmış her alt sürecin kendine ait bir kalıcı bağlantısı vardır. Örneğin, SQl sunucunuza kalıcı bağlantı açan betiğiniz 20 ayrı alt süreç çalıştırıyorsa alt süreç başına bir tane olmak 20 ayrı bağlantı var demektir.

Önemli Not: Ancak şuna dikkat edin, bağlantı sayısı sınırlı bir veritabanını bu sınırın üstünde kalıcı bağlantılarla kullanıyorsanız bunun bazı götürüleri olabilir. Eğer veritabanınız aynı anda 16 bağlantılık bir sınıra sahipse ve çok meşgul bir sunucu oturumunda 17 alt evre bağlantı açmaya çalışıyorsa biri bunu başaramayacaktır. Eğer betiğinizde (sonsuz döngü gibi durumlarda) bağlantıların kapatılmasına izin vermeyen hatalar varsa, veritabanı sadece 16 bağlantı ile hızla batağa saplanacaktır.

Zaman aşımı vb. durumlarda mysql bağlantınız kapanacaktır. Bu tip durumlarda mysql_ping ile kontrol edebiliriz. Bu fonksiyon mysql bağlantısı kontrol ettiği gibi tekrar bağlanması için de çaba sarfeder. Biz bunu daha etkili kılmak için şöyle bir yol izleyeceğiz:

<?php
$vt = mysql_pconnect($sunucu, $kullanici, $sifre);

if(!mysql_ping($vt)){
      $vt = mysql_pconnect($sunucu, $kullanici, $sifre);
}
/*
      İşlemleriniz
*/
?> 

Bu şekilde amacımıza tam olarak ulaşmış oluyoruz. Yukarıdaki notu dikkate alarak bu fonksiyonu kullanabilirsiniz. Herkese kolay gelsin,











RSSTwitter

En son yazılanlardan ilk senin haberin olsun


Valid HTML 5 Valid CSS!

Güncel Programlama Makaleleri by TR Kodlama © 2009 is licensed under a Creative Commons Alıntı-TicariOlmayan 3.0 Unported License.