GİRİŞ
CGI Nedir?
CGI'nin uzun hali "Common Gateway Interface"dir. Türkçesi "Web Server'a Ortak Çıkış Kapısı" dir. Server'ın veritabanlarına, dökümanlara ve diğer programlara bilgi gönderebileceği (veya alabileceği), ve bu bilgiyi web üzerinden kullanıcılara sunabileceği bir metoddur. Kısaca web için programlama diyebiliriz yani. CGI programları değişik dillerde yazılabilir. Ama en popüleri Perl'dür ve Perl'ü anlatacağız.
Neden CGI bilmeliyiz?
Bir web sayfası hazırlıyorsanız, sayfanızın kaç kişi tarafından ziyaret edildiğini bilmek, ya da sayfanızda ziyaretçilerin düşüncelerini mail adresinize gönderebileceği bir form olmasını istersiniz. Bugün profesyonelce hazırlanan web sayfaları form gönderme ve sayaç gibi basit scriptlerden tutun da karmaşık veritabanı scriptlerine varana kadar birçok değişik scriptle desteklenmektedir. Kısacası günümüzde CGI bilmek bir ayrıcalıktır.
Başlangıç için neler gerekli?
Her ne kadar UNIX sistemi üzerinde Perl ile CGI programlamayı anlatacak olsak da başlangıç için UNIX bilgisine sahip olmanız gerekmiyor. Çünkü zaten bilmeniz gereken kısmı burada size anlatılacak. UNIX bilgisi gerekli değil dedik ama, tabi ki bir UNIX accountunuzun olması gerekiyor. Eğer yoksa size
http://www.virtualave.net'de bir account açtırmanızı tavsiye ederim. Aslında tam olarak bir UNIX accountu vermiyorlar ama CGI scriptlerinizi çalıştırabileceğiniz bir cgi-bin dizininiz oluyor. Buraya FTP ile bağlanıp scriptlerinizi gönderebilirsiniz. Bu konuda daha ayrıntılı bilgi edinmek için web sitesini ziyaret ediniz.
Eğer UNIX değil de Windows NT kullanıyorsanız yine de buradaki programların çoğunu çalıştırabilir ve Perl öğrenebilirsiniz. Çoğu NT makinesi UNIX makinesinin çalıştırdığı kodları çalıştırabilir. Ama örneklerimizden bazıları UNIX'e özel yazıldığı için makinenizde çalışmayacaktır. Daha fazla bilgi için perl.com'un Perl Resources For Windows (Windows İçin Perl Kaynakları) listesini gözden geçirin.
Scriptlerinizi Windows kurulu bir bilgisayarda çalıştırmak için
http://www.activestate.com/ActivePerl/download.htm adresinden ActivePerl'ü indirebilirsiniz. Eğer yazdığınız scriptleri UNIX sistemine göndermeden önce kendi bilgisayarınızda denemek istiyorsanız bu programı mutlaka indirin.
UNIX sistemine telnet ile bağlanacağımız için bir telnet programına ihtiyacınız olacak tabi. Windows'la birlikte gelen basit telnet programı da işinizi görür. Windows kullanıcısı değilseniz ya da başka bir program kullanmak istiyorsanız tavsiye edeceğim program:
Macintosh için: NCSA Telnet
Windows için: CRT
Eğer scriptlerinizi kendi bilgisayarınızda yazıp gönderecekseniz tavsiye edeceğim program:
Macintosh için: Fetch
Windows için: CuteFTP
Okuma kolaylığı açısından Perl ve HTML kodlarını sabit genişlikli bir font kullanarak yazacağım. Mesela:
print "Bu bir Perl kodu.\n";
Ayrıca UNIX komut satırında yazmanız gereken komutları anlatırken <Dosya Adı> gibi < ve > karakterleri arasında yazacağım kısımları kendinize uygun şekilde değiştirmeniz gerekecek. Örneğin chmod 755 <dosya adı> dediğim zaman yapmanız gereken dosyanızın adı sayac.cgi ise komut satırında chmod 755 sayac.cgi yazmak.
Sanırım bu kadar hazırlık yeterli. Şimdi ilk bölüme geçebiliriz.
Bölüm 1: Başlangıç
Programlama dili olarak Perl'ü seçtik, çünkü basit bir dil, kolay öğreniliyor ve karmaşık problemleri halledebilecek kadar da güçlü. Ayrıca hem ücretsiz hem de bulunması çok kolay. Zaten çok büyük bir ihtimalle UNIX server'ınızda ya da NT makinenizde kuruludur. Yine de download etmeniz gerekiyorsa
http://www.perl.com'u ziyaret ediniz. Perl ile yazdığınız scriptleri derlemenize gerek yoktur. Scriplerinizi yazar ve çalıştırırsınız (Daha doğrusu web server'ınız çalıştırır). Script kendi başına sadece text kodudur. Aslında bütün işi web server'ınızda kurulu olan Perl yorumlayıcısı yapar. Bunun size sağladığı avantaj yazdığınız scriptleri ya hiçbir değişiklik yapmadan ya da çok küçük bir iki değişiklikle istediğiniz servera kopyalayabilecek olmanız. Dezavantajı ise scripti çalıştırmadan hatalı olup olmadığını anlayamamanız.
Perl scriptlerinizi kendi bilgisayarınızda istediğiniz text editörü ile (Notepad, SimpleText vb.) ya da UNIX'te yazabilirsiniz. UNIX kullanıyorsanız pico'yu deneyin. Basit ve kullanımı kolay bir text editörü. UNIX komut satırında pico <dosya adı> yazarak yeni bir dosya ya da varolan bir dosyayı açabilirsiniz. Pico ile ilgili daha fazla bilgi almak için man pico yazınız.
Scriptlerinizi kendi makinenizde yazıp FTP ile gönderecekseniz dikkat etmeniz gereken husus binary değil ASCII olarak göndermek. CuteFTP kullanıyorsanız sorun yok. Ama WS FTP programı Perl dosyaları için genelde ASCII değil binary kullanıyor.
Scriptlerinizi server'ınızda CGI scriptlerini çalıştırabileceğiniz dizine (public_html ya da /home/httpd/cgi-bin olabilir) upload etmelisiniz. Başka bir dizine upload etmişseniz daha sonra da taşıma işlemini yapabilirsiniz. UNIX'te taşıma işlemini şu komutla yapabilirsiniz:
mv <taşınacak dosya> <taşınacağı dizin> (Daha fazla bilgi için man mv)
Scriptinizi gerekli dizine taşıdıktan sonra bu dosyayı "çalıştırılabilir" hale getirmeniz gerekir. Bunun için kullanmanız gereken komut:
chmod 755 <dosya adı>
Bu komut dosyanın sizin tarafınızdan okunabilir, yazılabilir ve çalıştırılabilir, diğer bütün kullanıcılar tarafından da okunabilir ve çalıştırılabilir hale getirilmesini sağlar.
Aynı işi çoğu FTP programı ile yapabilirsiniz. Fakat dikkat etmeniz gereken kısım bütün kullanıcılara okuma ve çalıştırma hakkı vermek ve tabi ki sadece kendinize yazma hakkı vermek.
UNIX ve Perl'de büyük küçük harf ayrımı vardır. Yani UNIX'te "perl" ile "PERL" aynı şey değildir.
Perl Scriptinin Temelleri
Bir HTML dosyasının yapısında <head> ve <body> etiketlerinin mutlaka bulunması gerektiği gibi bir Perl scriptinin ilk satırında
#!/usr/bin/perl
satırının mutlaka bulunması gerekir. Bu satır server'a bu dosyanın bir Perl scripti olduğunu ve Perl'ün nerede olduğunu söyler. Bu satır sisteminizde Perl'ün nerede olduğuna bağlı olarak değişebilir. Bunu öğrenmenin en emin yolu which perl ya da whereis perl komutunu kullanmaktır. Perl sisteminizde kurulu ise Perl'ün hangi dizinde olduğu yazacaktır.
Server'a Perl'ün yerini tanıttıktan sonra Perl kodlarınızı yazabilirsiniz. Hatırlamanız gereken önemli bir konu Perl'de büyük küçük harf ayrımının olduğu. Yani Perl için "x" ile "X" aynı şeyler değildir. Ayrıca çoğu Perl kodunun sonunda noktalı virgül ( kullanmalısınız (Bazı döngü ve özel yapılar hariç).
Şimdi birlikte ilk scriptimizi yazalım. Yeni bir dosya oluşturun ve şunları yazın. (Daha iyi aklınızda kalması açısından Kopyala - Yapıştır yöntemini kullanmamanızı tavsiye ederim.)
#!/usr/bin/perl
print "Merhaba\n;"
Bu dosyayı "ilkscript.pl" adıyla kaydedin ve UNIX komut satırında şunu yazın:
chmod 755 ilkscript.pl
Bu komut dosyanın erişim yetkilerini değiştirerek onu çalıştırılabileceğiniz hale getirir. Bunu her yeni script yazışınızda yapmanız gerekir. Fakat varolan bir dosya üzerinde değişiklik yaptığınız zaman bu komutu vermenize gerek yoktur.
Şimdi, yazdığınız scripti çalıştırmanız için vermeniz gereken komut:
./ilkscript.pl
Eğer herşey yolunda gitmişse ekranda "Merhaba" yazması gerekir.
Olmadı mı?
Eğer scriptiniz çalışmazsa şunları kontrol edin:
1. Scriptinizi ASCII olarak upload ettiniz mi?
2. Scriptinizin ilk satırı #!/usr/bin/perl mü?
3. Perl'ün yeri gerçekten #!/usr/bin/perl mü yoksa başka bir dizinde mi? Perl'ün nerede olduğunu which perl ya da whereis perl yazarak bulabilirsiniz.
CGI Scriptinin Temelleri
CGI programları aynı zamanda birer Perl scriptidir. Fakat aralarındaki önemli bir fark CGI programlarının genelde bir web sayfası üretmesidir. Örneğin bir form gönderildikten sonra mesajın gönderildiğine dair yeni bir sayfa açılır. Eğer yazdığınız script bir HTML sayfası oluşturacaksa herhangi bir yazı yazdırmadan önce
print "Content-type:text/html\n\n";
satırını mutlaka yazmalısınız. Unutulması ihtimaline karşı en başa yazılması daha iyi olur (#!/usr/bin/perl satırından sonra tabi).
Bu satır web browser'ınıza kendisine gönderilecek bilginin bir HTML sayfası olduğunu söyler. Eğer bu satırı yazmayı unutursanız ya da bu satırdan önce başka birşey yazdırırsanız browser <Internal Server Error> (Dahili Server Hatası) verir.
Şimdi yaptığımız Perl scriptini biraz değiştirelim ve web sayfası gösteren bir CGI scriptine çevirelim.
Önce dosyanın uzantısını .cgi olarak değiştirelim. UNIX'te bunu
mv ilkscript.pl ilkcgi.cgi
komutunu vererek yapabilirsiniz. Daha sonra bu dosyanın içeriğini şu şekilde değiştirin:
#!/usr/bin/perl
print "Content-type:text/html\n\n";
print "<html><head><title>Deneme Sayfası</title></head>\n";
print "<body>\n";
print "<h2>Merhaba</h2>\n";
print "</body></html>\n";
Eğer scriptinizdeki değişiklikleri UNIX üzerinde yapmışsanız erişim yetkilerini tekrar düzenlemenize gerek yoktur. Ama kendi bilgisayarınızda yazıp upload etmişseniz chmod 755 ilkcgi.cgi komutunu verip erişim yetkilerini değiştirin ve ./ilkcgi.cgi komutu ile scriptinizi çalıştırın. Ekrana HTML kodları gelecektir. AMA eğer yazdığınız kodlarda bir hata varsa o zaman ekranda hatanın kaçıncı satırda olduğu yazar. Bu da özellikle uzun ve karmaşık scriptler yazarken olası hatayı düzeltmemizde bize oldukça kolaylık sağlar.
Şimdi de browser'ınızın adres satırına tam adresini yazarak scriptinizi çağırın. Browser'ınızda "Merhaba" yazdığını göreceksiniz.
Olmadı mı?
Scriptinizin çalışmamasının nedeni şunlar olabilir:
1. Eğer karşınıza "Merhaba" yerine Perl kodları çıkmışsa scriptin uzantısını .cgi olatak değiştirmemiş olabilirsiniz. Ya da scriptin bulunduğu dizin CGI programlarını çalıştıracak şekilde ayarlanmamıştır (CGI scriptlerinizi hangi dizinde çalıştırabileceğinizi server'ınızın yöneticisine sormalısınız).
2. Browser'ınız "Internal Server Error" hatası veriyorsa scriptinizi ./ilkcgi.cgi komutu ile çalıştırın. Ekranda hatanın nerede olduğu yazacaktır.
Yukarıdaki scripti şu şekilde yazarsak her satırda print yazmaktan kurtuluruz:
#!/usr/bin/perl
print "Content-type:text/html\n\n";
print <<HTMLSonu;
<html><head><title>Deneme Sayfası</title></head>
<body>
<h2>Merhaba</h2>
</body></html>
HTMLSonu
;
print <<HTMLSonu; satırında << ile HtmlSonu arasında boşluk olmadığına dikkat edin.
Bu sayfada Perl kodları, daha anlaşılır olması açısından satır girintileri kullanarak yazılmıştır. Perl kodlarını yazarken mutlaka ilk sütundan başlayarak yazılmalıdır. Özellikle HTMLSonu satırından önce kesinlikle boşluk bırakılmamalıdır. Eğer bırakılırsa scriptiniz çalışmaz.
HTML kodlarını bu yöntemle yazdırırsak aşağıdaki örnekte olduğu gibi print komutunu kullanırken iç içe çift tırnak (") karakteri kullanmak zorunda olduğumuz zaman çift tırnaktan önce ters bölü (\) karakteri yazmak zorunda kalmayız.
print "<a href=\"http://cc.sau.edu.tr/\">"
print komutunda iç içe tırnak karakterleri kullanmak için yukarıdaki gibi çift tırnaktan önce ters bölü karakterini yazmak zorundayız.