Perl ile CGI Programlama

 

İçindekiler

 

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?
Cevap: Çok basit ve aşağıdaki gibi...

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.