![]() |
| |||||||
| Kayıt ol | Forum Kuralları | Yardım | Üye Listesi | Takvim | Arama | Bugünün Mesajları | Forumları Okundu Kabul Et |
| Duyurular |
| Web Master Dünyası Web tasarımı ve teknik donanımları konusunda uzmanlaşmış veya uzmanlaşmayı kafasına koymuş üyelerimiz için büyük bir web dersanesi niteliğinde bir bölüm. Farklı bilgiler, bu yeni dünyadan en son haberler ve daha fazlası. |
![]() |
| | LinkBack | Konu Seçenekleri | Gösterim Modu |
| ||||
| SQL Caching - Nasıl Yapılır? Hız Hız Hız.. İlk kullanılmaya başlandığından bu yana internet üzerinde çok fazla değişiklik oldu. Sadece metinden oluşan web sitelerinden, görselliğin ön plana çıktığı şaheserlere; statik HTML sayfalarından, karmaşık programlara geçiş hepimizin gözü önünde gerçekleşti. Önceden "sadece içerik önemlidir" diyenler şimdi görselliğinde ne kadar ön planda olduğunu inkar edemiyorlar. Fakat bu kadar yoğun içerik sunan web sitelerinde yeni bir problem ortaya çıktı: Hız. Halen çok fazla Dial-Up kullanıcısı olduğu düşünüldüğünde (ne yazıkki bende onlardan biriyim), kullanılan resimlerin biraz yük getirdiği açık. Hele sunucu taraflı programlama dilleriyle birlikte varlığından daha fazla haberdar olunan veritabanları da işin içine girince ortalık biraz daha karışıyor. Kullanacağınız görselliğe bir diyeceğim yok, ama veritabanı probleminiz için belki bir çözüm önerebilirim. Madem web siteleri hazırlıyorsunuz, o zaman biliyorsunuzdur; cache (önbellek diyenlerde var, cache demeyi tercih edeceğim) kavramı tarayıcılarla beraber bizlerinde günlük yaşamına adım attı. Hala "cache nedir?" diye soranlarınız mı var? Ufak bir açıklama yapalım o zaman. İnternette dolaştığınızda, geztiğiniz sitelerde bulunan resimler, html sayfaları, sunucu taraflı dillerin HTML çıktıları, scriptler, css dosyaları, vs 'nin hepsi önce bilgisayarınıza yüklenir. Bu dosyaların hepsi tarayıcınıza özel klasörlerde bulunur. Neden mi? Bir daha aynı siteyi ziyaret ederseniz aynı sitenin daha hızlı yüklendiğini görürsünüz. Tarayıcı bu siteden yüklenmiş olan dosyaları tekrar yüklemek için zahmete girmez, daha önce yüklenmiş olan dosyaları kullanır. İşte bu şekilde bilgisayarınıza yüklenmiş olan dosyalar topluluğuna cache adı verilir. Cache'in bir işlevini de, tarayıcınızı "çevrim dışı" çalıştırdığınızda görebilirsiniz. Daha önce ziyaret ettiğiniz siteleri, internete bağlı olmadığınız halde, görebilirsiniz. Burada yine cache kullanılmaktadır. Neden mi anlattım bu kadar şeyi? Önereceğim çözümde buna benzer olacakta ondan. Hemen bir örnekle açıklamaya çalışayım. Diyelimki bir alışveriş sitesi hazırlamaktasınız ve bu sitede ürünler birçok kategorinin altında listeleniyorlar. Site sahiplerinin kolayca kategori ekleyip, var olanlarda değişiklik yapabilmesi içinde bütün kategorileri veritabanında tutmaya karar verdiniz (Belki çok iyi değil ama sık kullanılan bir çözüm). Sitenin her sayfasında bu kategorilere ihtiyacınız olacağına göre her sayfada veritabanına bağlanıp kategorileri tekrar tekrar sorgulayacak mısınız? Diyelimki böyle yaptınız, ama sorunu biraz daha komplike hale getirelim. Klasik DHTML drop down menü kullanmaya karar verdiniz, yani kategorileriniz alt kategorileri de var. Bu da sorgulamanın bir sorgudan oluşmayacağını, oluşsa bile bir çok dizi işlemiyle uğraşacağınızı gösterir. Kafanızı biraz daha kaşıyın ve işin içinden çıkmaya çalışın. Yada sizi zahmete sokmayayım, cache mantığını kullanalım İlk Göz Ağrısı: Dosyalar Daha fazla laf salatası yapmadan, bir örnek ile başlayıp ona devam edeceğim. Örneğimiz kullanıcı kaydı yapan bir formdan oluşuyor. Kod: <html>
<head>
<title>forum.zoque.net</title>
</head>
<body>
<form>
<label for="ad">Adınız</label> <input type="text" name="ad" id="ad"><br />
<label for="soyad">Soyadınız</label> <input type="text" name="soyad" id="soyad"><br />
<input type="submit" value="Üye Ol!">
</form>
</body>
</html>
Kod: <label for="il">Yaşadığınız İl</label>
<select name="il" id="il">
<option>--Lütfen Seçiniz--</option>
<option value="01">Adana</option>
<option value="02">Adıyaman</option>
<option value="03">Afyon</option>
...
</select>
İsteğimiz bu illeri her seferinde veritabanından sorgulayarak oluşan hız kaybını yok etmek (Biliyorum, çok kısa bir süreden bahsediyoruz bu örnekte. Fakat bu sorgunun yanına başka sorgularda gelince hız farkedecektir, bana inanın). Niyetimiz veritabanından çektiğimiz verileri bir dosyaya kaydetmek ve yeniden sorgulamak gerektiğinde bu dosyadaki içeriği kullanarak işleri hızlandırmak.. Yine sana işimiz düştü, dosya fonksiyonları. Devam etmeden once aşağıda kullanacağım dosya fonksiyonlarının işlevlerini hatırlatmak istiyorum: fopen: Dosya açmak için kullanılır. fwrite: Dosya içeriği yazmak için kullanılır. fread: Dosya içeriği okumak için kullanılır. fclose: Açılmış bir dosyayı kapatmak için kullanılır. file_exists: Bir dosyanın var olup olmadığını kontrol etmek için kullanılır. filemtime: Dosyanın son değişiklik tarihini öğrenmek için kullanılır. filesize: Dosyanın byte olarak büyüklüğünü verir. Şimdi kodlara geçelim. PHP- Kodu: Sanırım bu bize istediğimizi veriyor. Şimdi bu kodla biraz oynayarak alınan sonucu cache dosyasına yazmaya çalışalım. PHP- Kodu: Kod sırası takip edilirse, işlemin getContents() fonksiyonunun çağırılması ile başladığını söyleyebiliriz. Bu fonksiyon çağırıldığında öncelikle bir cache dosyasının var olup olmadığı checkCacheFile() fonksiyonu yardımıyla kontrol ediliyor. Eğer bir cache dosyası bulunamazsa veritabanına bağlanılıp aynı sorgular gerçekleştiriliyor. Fakat bu sefer uygulanan adımda bir farklılık var. Gelen sonuc direk çıktı olarak kullanılmıyor, onun yerine $tmp adında bir diziye aktarılıyor. Tüm sonuçlar bu diziye aktarıldıktan sonra fopen() yardıyımla cache dosyası yazma modunda (w) açılıyor ve elde ettiğimiz dizi serialize edilerek dosyaya yazdırılıyor. Bir daha aynı sorgu gerçekleştirildiğinde, artık bir cache dosyası bulunacağından dolayı, önce cache dosyası okuma modunda açılır (r) ve içeriğin tamamı okunur. Daha sonra elde edilen içerik unserialize edilerek geri döndürülür. Programı çalıştırdığınızda cache dosyanızda buna benzer bir görüntü olduğunu görmelisiniz:
Diyelimki devlet büyüklerimiz bir ilçemizi daha il yaptı, 82 ilimiz oldu. Problem yok, hemen veritabanına ekledik. Ama biz bir cache dosyası oluşturmuştuk ve o dosya varken veritabanına ulaşmaya gerek yok demiştik! Ne yapacağız? Hemen kafanızın yanında bir ampül yandığını görüyorum, dosyayı sileriz! Evet çözüm bu kadar basit. Her seferinde dosyayı silmeye başladık diyelim ama ya unutursak ne olacak? En iyisi biraz otomatik çalışalım ve bırakalım yazdığımız program bizim yerimize düşünsün. Çözümümüzü iki adımdan oluşturalım. İlk olarak (burada gösterilmeyecek), veritabanına yeni bir il eklediğimiz dosyada ufak bir değişiklik yapalım ve unlink() fonksiyonu ile yeni il eklendiğinde, oluşan cache dosyasını silelim. İkinci adımda ise, otomatik olarak oluşan cache dosyasını belirli periyotlarda silelim ve dosyaya veritabanından taze bilgiler gelmesini sağlayalım. Örneğimizde kodlarımızı, dosyayı haftada bir yenileyecek şekilde değiştirelim. Elimizde örnek üzerinde, bulduğumuz çözümü uygulamak da kolay olacak. Değişiklik sadece checkCacheFile() fonksiyonunda olacak. PHP- Kodu: En basit haliyle yaratılacak cache dosyası bu kadarlık bir el emeğinden oluşuyor. Bir sonraki adımda işin içine biraz daha profesyonel bilgi katmaya çalışacağız. O Obje Senin, Bu Obje Benim Buraya kadar öğrendiğimiz basit bilgiyi, biraz derleyip toparlayalım ve şık bir görüntü verelim. Yazdıklarımızı bir sınıf halinde toparlayalım. Buradan itibaren yazacağım sınıf, başka bir sınıfın yardımıyla oluşturulacaktır. Bu sınıfı forum.zoque.net adresinde de bulabilirsiniz. Yardımcı sınıf aşağıda verilmektedir. (Tabiki yazacağımız yeni sınıfı, bu sınıf olmadan da yazabiliriz. Hem araya veritabanı kodları ekleyerek asıl konudan uzaklaşmamak, hemde iki sınıfın birlikte nasıl kullanılabileceğini göstermek adına böyle bir yol seçtim) PHP- Kodu: DB sınıfı yardımıyla Cache sınıfı iki şekilde oluşturulabilir. Birincisi DB sınıfından türetme yapılabilir. İkinci olarak bir DB sınıfı nesnesi Cache sınıfına parametre olarak verilebilir. Yapacağımız örnekte ikinci yolu kullanacağım. Sınıfı adım adım oluşturalım. PHP- Kodu: Cache nesnesi yardımıyla veri okumayı read() metodu yardımıyla yapacağız. PHP- Kodu: read() metodu basit olarak öncelikle cache dosyasının varolup olmadığını kontrol ediyor. Varsa bu dosyayı ekliyor ve bu dosya içinde bulunan bir değişkeni geri döndürüyor (Unutmayın, cache dosyalarını PHP dosyası olarak oluşturuyoruz!). Dosyanın varolup olmadığının kontrolünü yapan exists() metodu, daha önce yazdığımız fonksiyonun tam olarak aynısı. Şu anda read() fonksiyonu, istediğimiz dosya varsa işlemi güzel olarak yapıyor, peki ama ya yoksa? O zaman dosyanın bulunmadığı durumda ne yapması gerektiğini de belirtelim. PHP- Kodu: Oku Oku Bitmedi! Sırada veritabanından bilgileri okumak var. Burada yukarıda belirtilen DB sınıfı kullanılacak. PHP- Kodu: Son olarak cache dosyamızı oluşturalım. PHP- Kodu: Not: Dosya UNIX dosya sitemiyle olu?turuluyor. Oluşan dosyayı notepad ile açarsanız, satırların birbirine karışmış olduğunu görebilirsiniz. Merak etmeyin hatalı çalışmaz. Notepad ile de doğru olarak görüntülenmesini isterseniz \n yerine \r\n yazabilirsiniz. Sınıfa birde dosyayı silen ufak bir method eklersek: PHP- Kodu: PHP- Kodu: PHP- Kodu: Yusuf Uğur Soysal - hayalet. |
![]() |
|
| Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir) | |
| Konu Seçenekleri | |
| Gösterim Modu | |
|
|
| | ||||
| Konu | Yazar | Forum | Cevaplar | Son Mesaj |
| Türbanlı Porno Nasıl Yapılır? | BaHTiYaR | Türkiye'nin Sorunları | 33 | 25.08.08 10:11 |
| photoshop ta gif nasıl yapılır?? | DAFNE | Yardım Merkezi | 2 | 28.10.06 23:26 |