Perl ile CGI Programlama |
BÖLÜM 1: GİRİŞ Benim CGI programlama
için tercih ettiğim dil Perl’dir. Perl oldukça basit bir dildir, öğrenmesi
çok kolaydır ve birçok zor ve karmaşık işi gerçekleştirmek için de yeterince
güçlüdür. Her yerden temin edilebilir, ücretsizdir ve muhtemelen çalıştığınız
UNIX (veya Win NT) sunucusu üzerinde önceden hazır kurulmuş vaziyettedir. Perl, (Practical
Extraction and Report Language) kelimelerinin türetilmiştir ve ilk kez Larry
Wall tarafından düşünülmüştür. Daha sonradan ise pek çok gönüllü programcı
tarafından geliştirilmiş, kütüphaneleri hazırlanmıştır. Hatta Microsoft da
ActiveState projesi dahilinde Perl’i UNIX ortamından Win32 platformuna
taşımıştır. Perl bir yorumlayıcı
dildir. Bunun anlamı, yazdığınız programlarınızı derlemek zorunda
kalmıyorsunuz; sadece yazıyorsunuz ve çağırıyorsunuz. Web sunucusu sizin
adınıza çalıştırıyor. Hepsi bu kadar... Bir betik (script demek daha doğru
aslında) metin halinde yazılan Perl kodudur. Perl yorumlayıcısı sadece bu
metni alır ve çalıştırır, ilave işlemlere gerek yoktur. Bunun avantajı,
betiğinizi Perl yüklü olan herhangi bir makineye kopyalayıp çok az yada
hiçbir değişiklik yapmadan aynen çalıştırabilmektir. Dezavantajı ise hataları
önceden görmek için betiği mutlaka çalıştırmak ve test etmek zorundasınız...
Bazen gözden kaçan durumlar sizi saatlerce uğraştırabilir. Perl betiklerinizi ya
kendi lokal makinanızda (Notepad, Simpletext vb. editör programlarıyla) yada
Unix sunucu üzerinde hazırlayabilirsiniz. Eğer Linux kullanıyorsanız pico
veya joe gibi editör programlarını kullanabilirsiniz. Yazdığınız betikleri
kaydederken binary değil, mutlaka text formatında kaydetmelisiniz. (UNIX
sistemlerde jpeg/gif/au gibi binary veriler dışında tüm HTML dosyalar ve Perl
CGI betikleri text formatındadırlar.) Daha sonra bir FTP programıyla (mesela
CuteFTP, WS_FTP gibi) betiklerinizi Unix sunucuya aktarmanız gerekir. Peki nereye? Aksi
belirtilmedikçe kendi ev (home) dizininiz altında bulunan ve web
sayfalarınızın yer aldığı /home/username/public_html dizinine... Daha sonra
ise, Perl betiklerinizin “executable” yani çalıştırılabilir olması için
aşağıdaki komutlardan birini kullanarak erişim haklarını değiştirmeniz
gerekir. chmod 755 dosyaadı chmod +x dosyaadı Buradaki erişim hakları,
sırasıyla dosyanın sahibi, grubu ve diğer kullanıcılar için ayrı ayrı
belirtilir. Haklar okuma (r; 4) , yazma (w; 2) ve çalıştırma (x; 1)
şeklindedir. 755 (rwx r-x r-x) sahibine okuma, yazma ve çalıştırma; grubuna
ve diğerlerine okuma ve çalıştırma hakları verilmiş demektir. Ayrıntılı bilgi
için bir UNIX kullanım kılavuzuna bakınız. Önemli Hatırlatma: Perl
kodu, UNIX komutları ve dosya/dizin isimleri küçük büyük harf duyarlıdır ve
genelikle küçük harfler kullanılır. Bunu aklınızdan çıkarmamanız gerekir...
Tamam mı? Bir Perl Betiğinin Yapısı Perl öğrenmeye çalıştığınıza
göre muhtemelen HTML’ye aşinalığınız vardır ve bir HTML dökümanının genel
yapısını biliyorsunuzdur... Nasıl ki bir HTML dökümanı <head> ve
<body> gibi tag’lar içerirse, yada bir hiperbağ veya resmi göstermek
için belirli sentaks kuralları varsa Perl için de aynı şeyler söz konusudur.
Perl’in sentaks yapısı oldukça basittir ve anlaşılırdır. Eğer bu sentaks
kurallarını bir kereliğine öğrenirseniz Perl ile CGI programı yazmak, HTML
yazmak kadar basittir. Bekleyin, görün... Malumdur ki UNIX’in çok
güçlü betik yapısı (shell script) vardır. Bu, varsayılan olarak bash
script’tir. Perl ile yazılan betiklerde her betik dosyasının ilk satırında
aşağıdaki gibi bir deyimin olması gerekir. Bu satır, sunucuya bu betik
dosyasının Perl betiği olduğunu söyler. #!/usr/bin/perl Bu satırın yapısı özeldir
ve sentaksının hep bu şekilde olması gerekir. Ancak, her sistemde Perl
derleyicisinin kurulduğu yer /usr/bin/ dizini olmayabilir. which perl (yada whereis perl ) komutlarıyla Perl
derleyicinin bulunduğu yeri (yolunu) öğrenmek mümkündür. Yukarıdaki ilk satırdan
sonra, Perl kodunu yazmaya başlayabilirsiniz. Perl, yukarıda da belirtildiği
gibi, küçük büyük harf duyarlı bir dildir. Yani, ‘x’ ile ‘X’ aynı değildir.
Ayrıca, Perl deyimleri noktalı virgül (;) ile sonlanır. Döngüler ve şartlı
dallanma yapılarında (;) kullanılmaz. Bunlar, ileride tekrar ele alınacaktır.
Şimdi, ilk basit (ve klasik) Perl programımızı yazalım ve diske “first.pl”
adında bir dosya olarak kaydedelim. #!/usr/bin/perl print “Merhaba dünya!\n”; Şimdi, UNIX komut
satırından aşağıdaki komutu verelim: chmod +x first.pl Bu değişiklikle
yazdığımız programa çalıştırılabilme özelliği kazandırdık. Bunu her yeni
betik oluşturduğunuzda yapmak gerekir. Ancak, önceki bir dosyada değişiklik
yapınca buna gerek yok. Şimdi aşağıdaki komutu girerek ilk CGI programımızı
çalıştıralım. ./first.pl Eğer her şey yolunda
gitmişse ekranda “Merhaba dünya!” mesajı belirecektir. Bir CGI Betiğinin Yapısı Bir CGI programı da
aslında bir Perl betiğidir. Fakat, bir önemli farkı vardır ki CGI genellikle
bir web sayfası üretir (hazırlar). (Örneğin; bir form işleme CGI programı,
mesela ziyaretçi defteri, genellikle geriye “İlginiz için teşekkür ederiz”
türünden bir HTML sayfası gönderir.) Eğer siz de HTML üreten bir CGI programı
yazacaksanız programınızın herhangi bir yerine (ilk print deyimini
kullanmadan önce) aşağıdaki satırı mutlaka yazmalısınız. print “Content-type:text/html\n\n”; Buna MIME header (başlık)
denilmektedir. Ki bu satır, alıcı durumunda olan web tarayıcısına gelen
verinin ne tür bir veri olduğunu bildiren bir satırdır. Bu örnekte web
tarayıcıya, üretilen ve gönderilen bilginin bir HTML dökümanı olduğu
belirtilmek istenmiştir. Eğer bu satırı yazmayı unursanız yada bu satırdan
önce ekrana bir şeyler yazdırırsanız “Internal Server Error” şeklinde bir
hata mesajı ile karşılaşırsınız. Böyle bir durumla karşılaşmamak için ilk
başa yani #!/usr/bin/perl satırından sonra bu satırı da yazmak gerekir. Bu arada belirtmek
gerekirse CGI programlarının uzantıları .cgi ile biter. Ancak, Perl
betiklerinin uzantılarının .pl olması şart değildir. Şimdi, first.pl betiğini
alalım ve bir web sayfası üreten CGI betiğine dönüştürelim. Bunu da diskte
public_html dizini altına first.cgi dosyası olarak kaydedelim. #!/usr/bin/perl print "Content-type:text/html\n\n"; print "<html><head><title>Test Sayfası</title></head>\n"; print "<body bgcolor=\"red\" text=\"yellow\">\n"; print "<center><h2>Merhaba, televole!</h2>\n"; print "</body></html>\n"; Şimdi, bu programı da bir
önceki örnekte olduğu gibi çalıştıralım. Ne gördük? Gördüğümüz o ki; ekrana
bir HTML sayfasının kaynak kodları yazıldı. Bu aslında oldukça önemli. Çünkü,
üretilen web sayfasını inceleyerek hata olup olmadığını görebiliyoruz. Eğer
zaten hata varsa ilgili CGI programı çağrılınca (500 Server Error) hatası
üretilir. Soru: Bu betiği bir CGI programı
olarak nasıl çalıştıracağız? http://alaeddin.cc.selcuk.edu.tr/~adem/cgi-kitap/cgi-bin/first.cgi Şimdi bunu hemen
deneyelim ve sonucu görelim. Karşımıza “Merhaba dünya!” yazan bir web sayfası
gelmiş olmalı. PROBLEM?? NO
PANİK... 1. Eğer ekranda “Merhaba dünya!” yazan bir web
sayfası yerine bizim yazdığımız Perl kodları görünüyorsa, iki hata söz
konusudur; ya first.pl dosyasının adını first.cgi olarak değiştirmeyi unuttuk
yada bizim web sunucumuzun CGI konfigürasyonu yapılmamış. İlk iş Webmaster’a
başvurarak CGI programlarının nasıl çalıştırılacağını öğrenin. Eğer Webmaster
sizseniz, başınız belada demektir. Web sunucunun dokümalarını elden
geçirmeniz gerekir. Aksi bir durum yoksa, /var/lib/httpd/conf dizini altında
yer alan srm.conf dosyasını açın, AddType ile başlayan satırlardan .cgi içereninin
başındaki açıklama #-diyez işaretini kaldırın. Web sunucusunu yeniden
başlatın. Geçmiş olsun. 2. Eğer “Internal Server Error” şeklinde hata
mesajları alıyorsanız, sintaks hataları var demektir. Bu durumda yapmanız
gereken şey, betiği komut satırında ./first.cgi yazarak çalıştırmak ve hata
olup olmadığını görmektir. 3. Eğer “Forbidden ...” şeklinde hata mesajları
alıyorsanız erişim haklarını değiştirin. Perl’de ekrana bir şeyler yazdırmak için print deyimi kullanılır. Yazdırılacaklar “...” çift tırnak yada ‘...’ tek tırnak arasına alınırlar. Değişkenler, $degisken şeklinde yazdırılacak mesajın içinde yer alırlar. Bazı özel karakterleri yazdırmak için \-tersbölü işareti kullanılır. Örneğin, #, “, ‘, \, @, %, $ ve & işaretlerinin Perl'de özel anlamları vardır ve doğrudan yazdırılamazlar, yazdırmak için önlerine \-tersbölü gelir. Bu durum bazen kafa karıştırır. (İyi de, olmayan şey nasıl karışacak?...) Yukarıdaki CGI programını
yazmanın bir diğer (ve daha kolay) yolu da, tek bir print deyimi kullanmaktır: #!/usr/bin/perl print "Content-type:text/html\n\n"; print <<EndOfHTML; <html><head><title>Test Sayfası</title></head> <body bgcolor="red" text="yellow"> <center><h2>Merhaba, televole!</h2> </body></html> EndOfHTML; Dikkat etmek gerekirse << ile EndOfHTML arasında boşluk yoktur. Deyimin yapısı şöyledir: print <<EndOfHTML; Yukarıdan da görüldüğü
üzere; gereksiz yere kullanılan print deyimlerinden kurtulduk.Yine, bu
şekilde bir kullanım ile HTML kodlamasının kendine özgü olan bazı
sentaklarında, “...” çift tırnak kullanılan yerlerde, hata yapma olasılığı
ortadan kalkmaktadır: Örneğin; print “<a href=\”http://www.selcuk.edu.tr\”>Selçuk Üniversitesi</a>”; satırında URL’yi çift tırnak içine almak gerektiği için “URL” yerine \”URL\” gibi kafa karıştırıcı bir sintaks kullanmak gerekmektedir. Halbuki, ikinci yöntemde bu tür bir kargaşa söz konusu değildir. ¶ |
|
|
|
|