PHP ile MySQL bağlantısı yaparken kaç kez bağlantı açmak gerekiyor? Cevap database sayısı kadar yani 1 database varsa 1 bağlantı üzerinden her işinizi görebilirsiniz.
Başkalarının kodlarını incelerken sıklıkla gördüğüm; fonksiyon içlerinde ya da ayri dosyalarda ne zaman bir database bağlantısına ihtiyaç olsa hemen mysql_connect fonksiyonun çağrılması ve database bağlantısı açılması. Evet, kesinlikle iş görüyor, fakat olması gereken bu mudur? Ne gibi sakıncaları vardır?
1. Konfigürasyonun zorlaşması: Scriptte bir değişlik yapmanız gerekiyor; farz edelim username değişti, ne yapmalısınız? Bağlantı yaptığınız her yerde username’i değiştirmelisiniz. Bunun için bir fonksiyon yazdınız ise nispeten şanlısınız sadece fonksiyonun içinde değiştirmeniz sizi bundan kurtaracaktır ya da bağlantı parametrelerini değişkenlere yüklendiniz ise sadece bu değişkenleri değiştireceksiniz.
2. Kaynakları boşa harcama: Diyelim ki fonksiyon yazdınız, fakat bunu her ihtiyacınız olduğunda çağırarak tekrar bağlantı açılmasına neden oluyorsunuz bu da size zaman ve kaynak kaybı olarak geri dönecektir. Yani bir bağlantı harcadığınızda 1ms geçiyorsa 10 bağlantı için 10 ms geçecektir. Neyse ki php coderlari bunu düşünmüş ve kazın ayağı tam olarak böyle değil, bağlantı açıldığında eğer daha önce aynı parametreler ile bir bağlantı açılmışsa php yeni bir bağlantı açmayacak ve var olan bağlantıyı kullanacaktır, fakat bu durumda da mysql_select_db icin halen bir kayıp söz konusu. Aynı zamanda mysql_close yapıyorsanız veya bağlantı açarken link_identifier belirti iseniz. php yeni bağlantılar açacaktır yani yukarda verdiğim 1′e 10′luk örnek geçerli olacaktır. Bu kayiplar ms’ler mertebelerinde olduğu için pek önemsenmez. Döngü içinde 10.000, 100.000, 1 milyon bağlantı açıyorsanız bu ms’ler önem kazanmaya başlar, tabiki bu durumda coderlığınızdan şüphe etme vakti gelmiştir.
Kod yazarken olabildiğince kodu tek bir noktada toplamaya çalışmalısınız, mesela bir bağlantı fonksiyonu yazdınız ve bu fonksiyonu header, init, vs. gibi bir dosyada bir kez çağırdınız. Bu sizi her scriptinizde find/replace yapmaktan kurtaracaktır aynı zamanda bir kez çağırmış ve yazmış olacaksınız.
Rasmus Lerdorf c ile yazdığı ilk php versiyonu 8 Haziran 1995 tarihinde comp.infosystems.www.authoring.cgi usenet haber listesinde duyurmuş.
php 1.0 özellikleri kısaca
. Log Dosyaları tutma/izleme
. Günlük ve toplam erişim sayaçları
. Bağlananları banlama
. Şifre korumalı sayfalar
. Erişimler izleme
. Server side includelar, server desteklemese bile
. Web formları oluşturma
şeklinde, aslında bir ara deneysel olarak kurup fantazi yapmak lazım. Rasmus Lerdorf php’yi GNU lisansı altında yayınlamasaydı, ben ne iş yapıyor olurdum diye merak ettim şimdi. :) Birilerinin verdiği karar, hayatımızı nasılda etkiliyor. Herhalde kendisi bu kadar büyüyeceğini, yayılacağını düşünmemiştir, sonradan katkıda bulunanların etkisi en az onunki kadar büyük.
Aşağıda tam duyuru ve duyuruyu aldığım yerin linki bulunuyor.
These tools are a set of small tight cgi binaries written in C.
They perform a number of functions including:. Logging accesses to your pages in your own private log files
. Real-time viewing of log information
. Providing a nice interface to this log information
. Displaying last access information right on your pages
. Full daily and total access counters
. Banning access to users based on their domain
. Password protecting pages based on users’ domains
. Tracking accesses ** based on users’ e-mail addresses **
. Tracking referring URL’s - HTTP_REFERER support
. Performing server-side includes without needing server support for it
. Ability to not log accesses from certain domains (ie. your own)
. Easily create and display forms
. Ability to use form information in following documentsHere is what you don’t need to use these tools:
. You do not need root access - install in your ~/public_html dir
. You do not need server-side includes enabled in your server
. You do not need access to Perl or Tcl or any other script interpreter
. You do not need access to the httpd log filesThe only requirement for these tools to work is that you have
the ability to execute your own cgi programs. Ask your system
administrator if you are not sure what this means.The tools also allow you to implement a guestbook or any other
form that needs to write information and display it to users
later in about 2 minutes.The tools are in the public domain distributed under the GNU
Public License. Yes, that means they are free!For a complete demonstration of these tools, point your browser
at: http://www.io.org/~rasmus–
Rasmus Lerdorf
ras…@io.org
http://www.io.org/~rasmus
Döngüsel sorgular nedir, nasıl oluşur?
Bir döngü içinde mysql sunucusuna gönderilen sorgulara döngüsel sorgular ismini veriyorum, bu tip sorgular tehlikelidir çünkü kaynak, zaman tüketirler ve kod yazımı sırasında dikkat çekmezler, programcı işini en kısa sürede bitirmeye odaklandığı için, o an ihtiyacı olan veriyi sorgu ile almaktan çekinmeyecektir. Çoğu zaman da döngülerle çalıştığından, bir döngünün içinde, koşula bağlı olarak, defalarca sorgu gönderecektir. Geliştirme aşamasında veri ve kullanıcı sayısı az olduğu için performansta düşüş hissedilmez, fakat uygulama web’e konulduğunda biraz yoğun bir sistemde geç açılan veya hiç açılmayan sayfalara neden olacaktır.
Nasil engellenebilir?
Elbette en basit şekilde döngü içinde sorgu göndermeyerek, bunun içinde geliştirme aşamasında gönderdiğiniz sorguları izlemeli, gereksiz sorgulardan kaçınmalısınız. Kendi yazacağınız veya kullandığınız apinin gönderdiği sorguları raporlama özelliği, ADOdb‘nin böyle bir özelliği var, sorguların izlenmesini (debug) kolaylaştıracaktır. Bu arada herzaman döngüsel sorgular kullanılmaz diye bir tezim yok, bu tip sorgulara çoğunlukla update sorgularında ihtiyaç duyuluyor, fakat çoğu select ve insert sorgusu kodlama ile tek bir sorguya indirilebilir.
Örnekler
En basit örneği phpMyAdmin‘de görmüşsünüzdür. phpMyAdmin verileri export ederken adına extended inserts, Türkçesinde “Tablo ismini ve INSERT deyimini sadece bir kez kullan” olarak geçiyor, denilen aynı anda birden fazla satır oluşturan bir sorgu üretebilir. MySQL 3.22.5′den sonraki versiyonlarda geçerli olan, bu sorgu birden fazla insert yapmaya olanak sağlar.
Select sorgularını engellemek için join kavramını öğrenmemiz gerekiyor, zaten döngüsel sorgulara çoğu zaman farklı tablolarda bulunan veride önce bir veriyi çekip sonra ilişkili diğer veri/veriler için başka sorgular kullanılan durumlarda rastlıyorum, halbuki baştan yapıyı doğru kurarak join ile tek sorguda problem giderilebilir.
Henüz okumadım, aç gözlü eski bir kitap kurdu olarak indirdim, okunacak kitaplar arasına koydum. Biraz bakındım içeriğine ismi Power Programming ama daha çok giriş seviyesinde bir kitap, bu işe yeni başlayanların alıp okuyabileceği, bakabileceği bir başvuru kaynağı niteliğinde. Biraz uzun, 720 sayfa kadar diyorlar.
Kitap Sayfası : PHP 5 Power Programming
Gördüğüm Yer :Turk-PHP.com
Turk-PHP.com Kitaplar Dizini
Nedir? Neden gereklidir?
Dinamik içeriğe sahip sitelerde “0.021 sn’de üretildi, 34 sorgu kullanıldı” şeklinde yazılar görmüşsünüzdür. En basit kontrol bu tip notlar olsa gerek. Günümüzde her şey hızlı olmak zorunda kimsenin, özellikle web kullanıcılarının, sitenizin açılmasını beklemeye tahammülü yok.
Herkes optimizasyon ve daha iyi teknikler peşinde. Kaynakların önemini onları kaybettiğinizde, siteniz büyümeye başladığında, anlıyorsunuz. Daha hızlı sayfa üretmek için daha az sayıda sorgu kullanmak zorundasınız, daha az sorgu içinde ne kadar sorgu kullandığınızı bilmeniz, izlemeniz gerekiyor. Yazdığınız sorguları izledikçe aslında çoğunun birleştirilip, azaltılabileceğini göreceksiniz. Ayrıca daha önce döngüsel sorgulardan bahsetmiştim. Sorguları izlemek döngüsel sorguları kolayca farketmenizi sağlayacaktır. En azından ne yaptığınızı bileceksiniz.
Nasıl yapılır?
en basit şekilde bir fonksiyon yazarak izleyebilirsiniz. Aşağıdaki gibi bir fonksiyon gönderdiğiniz sorguyu global bir değişkene ekler. Sayfanın sonunda bu değişkeni bastırarak o sayfada ne kadar sorgu kullanmışsınız görebilirsiniz.
1 2 3 4 5 6 7 8 | <?php function t_mysql_query($qry) { global $allqry; $allqry .= $qry . "<br />"; return mysql_query($qry); } ?> |