PHP ile Linux Programlama (Perl ve C Tadında ;-)

0
FZ
FM'nin genç üyelerinden tasarımcı ve acemi çaylak programcı arkadaşımız knt'nin "Yahu hocam, C tadında PHP gibi bir şey olsa ne kadar güzel olurdu, benim işimi mükemmel görürdü" demesi ve benim onu eleştirmem ile başladı her şey. Birkaç gün sonra knt arkadaşımız karşımıza aşağıda okuyacağınız belge ile çıkageldi. Çoğu kişinin sadece Apache ve web programlama bağlamında kullanılabildiğini ve başka bir işe yaramadığını zannettiği PHP dili ile nasıl normal (!) GNU/Linux programlama yapılabileceğini gösteren bu başlangıç seviyesindeki belgeden ilgili kişilerin faydalanacağını umuyoruz. Lütfen belge ile ilgili yorumlarınızı ve varsa deneyimlerinizi, eleştirilerinizi yazmaktan imtina etmeyin. Ve karşınızda...

Perl Tadında PHP!

Internet programlama ile biraz uğraşmış ve bir miktar PHP öğrenmiş biri olarak, GNU/Linux ortamında, ufak tefek ve konsoldan çalışabilen programlar yazmak istediğimde Perl ve C üzerine pek fazla bilgim olmadığından her seferinde yaptığım ufak programcıklar için sayısız deveye hendek atlatıyordum. Ama geçenlerde yaptığım bir araştırma üzerine (IRC'de, irc.freenode.net sunucusundaki #fazlamesai kanalında) bir de baktım ki PHP programlama dili Apache web sunucusunun bir bileşeni olarak kullanılmasının yanı sıra tıpkı Perl ya da C gibi komut satırından çalıştırılabiliyormuş (Command Line Interface). Bu sayede hiç Perl ya da Python gibi güçlü betik-programlama dillerine gerek kalmadan aynı işi PHP ile de yapabilmiş olacağız, kaldı ki bu benim gibi öyle pek de usta olmayan programcılar, ama bunlara her an ihtiyaç duyan yaramaz ev kullanıc ıları için de bire bir ;-)

PHP 4.2.0 ve sonrası, size yeni bir SAPI (Server Application Programming - Interface/Sunucu Uygulama Geliştirme Arayüzü) olan CLI (Command Line Interface/Komut Satırı Arayüzü) özelliğini de beraberinde getirmiş oluyor. CLI'nin sağladığı en büyük avantaj, PHP ile komut satırı ve masaüstü için programlar yazabilecek olmanız. Hem de fazladan hiçbir kütüphaneye gereksinim duymadan.

4.3.0 versiyonuna kadar CLI'yi kurulum esnasından aktif hale getirmek zorundaydınız (--enable-cli). Fakat 4.3.0'dan itibaren bu özellik normal olarak aktif edilmiş durumda geliyor PHP sisteminde.

Burada dikkat edilmesi gereken şöyle ufak bir nokta var: Eğer sunucunuzdaki PHP desteğini Apache mödülü şeklinde kurduysanız sistem komut satırında PHP dosyalarını çalıştırmanız için size yeterli olmayacaktır. Bunun için çalıştırılabilir bir "binary" şeklinde PHP'ye ihtiyacımız var. Eğer source tarball'dan kurduys anız sorun yok. Modül şeklinde kurduysanız bunun binary'si için Debian'da:

apt-get install php4-cgi

komutu işinizi görecektir.

Komut satırından çalıştıracağımız çoğu PHP programı için bize gerekli olacak en önemli özelliklerden biri kullanıcının çalışma esnasında atadığı değerlerin algılanmasıdır: Kısacası STDIN (Standart Input). Bunun için iki yolumuz var: Birincisi progamın adı yazılırken girilen argümanlar. Bu tabii ki yeterli olmayacağından bir de programın çalısma esnasında girilen argümanlar var. Hepsine birer örnek vererek konuyu açıklığa kavuşturalım...

1. Hello, World!

Bir programlama dilin en vazgeçilmez örneğini kullanmadan edemezdik sanırım. Basit ve yumuşak(!) bir giriş yapalım bu PHP-CLI olayına...
$ cat ornek1.php
#!/usr/bin/php4
<? print "Hello, World!"; ?>

$ chmod 755 ornek1.php
$ ./ornek1.php
X-Powered-By: PHP/4.3.0
Content-type: text/html 
Hello, World!

2. Çalışma Esnası Girilen Değerlerin Algılanması

Bizim için en çok önem teşkil eden noktanın burası olduğu şüphe götürmez sanırım. Kullanıcıya program esnasında yöneltilen sorular karşısında alınan değerlerin değişkenlerde tutulması veya kullanılarak fonksiyon çalıştırılması için olmazsa olmazlar:
$ cat ornek2.php
#!/usr/bin/php4
<?
  print "Lütfen isminizi buraya girin: ";

   // Burada buffer için gerekli olan 256 değeri size kalmış
   $uname = fgets(fopen("php://stdin", "r"), 256);
   print "Merhaba, $uname";
?>

$ chmod 755 ornek2.php
$ ./ornek2.php
X-Powered-By: PHP/4.3.0
Content-type: text/html

Lütfen isminizi buraya girin: Volkan YAZICI
Merhaba, Volkan YAZICI
STDIN (girdi)'in dışında STDOUT (çıktı) ve STDERR (hata çıktısı) gibi stream'lere de (kanallara) sahipsin iz. Ayrınıtılı bilgi için yazının sonunda yer alan kaynakçaya göz atmanız yeterli. Yine de bunlar hakkında şö yle ufak bir alıntı yapmak gerekirse:

$stdin = fopen('php://stdin', 'r');
$stdout = fopen('php://stdout', 'w');
$stderr = fopen('php://stderr', 'w');

3. Program Argümanları

PHP, bilindiği üzere C'ye ve Perl'e çok benzer bir dil (teorik olarak pek fazla C ve Perl bilmediğimden sizleri bu konuda fazla aydınlatamayacağım). Bu yüzden başlangıçta atacağımız ilk adımlar C bilenlere çok tanıdık gelecektir sanırım...
$ cat ornek3.php
#!/usr/bin/php4 -q
<?
        // Yukarıya eklediğimiz -q parametresi ile başlangıçta yer alan
        // X-Powered-By: PHP... satırlarından kurtulmuş oluyoruz

        print "---$argc---";
        var_dump($argv);
?>

$ chmod 755 ornek3.php
$ ./ornek3.php -arg1 -arg2 abc

---4---
array(4) {
  [0]=>
  string(12) "./ornek3.php"
  [1]=>
  string(5) "-arg1"
  [2]=>
  string(5) "-arg2"
  [3]=>
  string(3) "abc"
}


Eğer #!/usr/bin/php4 satırının sonuna bir de -q parametresi eklerseniz X-Powered-By: PHP... satırlarından kurtulmuş olursunuz.

Özet

Özet olarak fazla söze ne hacet, hepsinin karşımı olan güzel bir program var burada sizler için yazdığım:

#!/usr/bin/php4
<?

        // Timeout olmaması için var olan zaman sınırını kaldırıyoruz
        set_time_limit(0);

        // Bakalım kullanıcımız ismini girmiş mi?
        if ( $argc == 1 ) {

                print ">>> İsminizi girmeyi unuttunuz!" . ">>> Kullanım: ./me.php Your Name";

                exit();

        } else {

                // Kullanıcımız
                for ( $n = 1; $n < $argc; $n++ )
                        $uname .= $argv[$n] . " ";
        
        }

        // Asıl nokta olan komut satırına girilen değerleri almak için
        // kullandığımız stdin değerini STDIN'e atıyoruz
        // Aksi halde her seferinde fopen("php://stdin", "r") satırını yazmak zorunda kalırız.
        define("STDIN", fopen("php://stdin","r"));
        
        // İşlem giriş çıkışlarının herbiri için teker teker bir fonksiyon tanımlamak
        // yerine hepsini bir class içine attım
       class process {
        
                var $menu, $key;
        
                // Varolan menüyü listelemk için kullanacağımız fonksiyon.      
                function listMenu() {
                
                        $this->menu = array( array("s", "Sistem Bilgisi"),
                                                                 array("d", "Geçerli Tarih"),
                                                                 array("q", "Çıkış") );
                
                        print ">>> Please select your process below...";
                
                        for ( $i = 0; $i < count($this->menu); $i++ )
                        print "	[" . $this->menu[$i][0] . "] " . $this->menu[$i][1] . "
";
                        print "";
                
                }
                
                // Menü ekrana yazdırıldıktan sonra girilen tuşa göre açacağımız menüyü
                // algılayacak olan fonksiyon
                function getKey() {
                
                        // Menüyü listeliyoruz
                        $this->listMenu();
                        
                        // İstenilen göreve gerekli yere dallaniyor
                        print ">>> Process No: ";
                        
                        // STDIN algılanıyor
                        switch ( trim(fgets(STDIN,256)) ) {
        
                                case "s":
                                        $this->clrscr();
                                        print ">>> " . trim(shell_exec("uname -a")) . "";
                                        $this->getKey();
                                        break;
                        
                                case "d":
                                        $this->clrscr();
                                        print ">>> " . date("Y-m-d") . "";
                                        $this->getKey();
                                        break;
                        
                                // Eğer kullanıcı çıkmak istediyse onu fazla tutmayıp STDIN'i kapattıktan
                                // sonra programa son veriyoruz
                                case "q":
                                        fclose(STDIN);
                                        print ">>> Kendinize iyi bakın ,)";
                                        exit();
                        
                                default:
                                   this->clrscr();
     print ">>> Hatalı giriş yaptınız!"                                     . ">>> Lütfen tekrar deneyin.";

                                  $this->getKey();

                                break;

                        }

                }

                // Ekranın temizlemenin en kolay yolu
                // Aksi halde ncurses'a girmemiz gerekecek...
                function clrscr() { system("clear"); }

        }


        // Bahsettiğim class'ı tanımlıyoruz ilk defa menümüzü klavyeden basılan tuşu
        // algılayacak şekilde çağırıyoruz.
        $process = new process;

        // Ekranı temizle...
        $process->clrscr();

        // Kullanıcımıza bi merhaba diyelim...
        print ">>> Hello, $uname.";

        // ilk defa menümüzü klavyeden basılan tuşu algılayacak şekilde çağırıyoruz.
        $process->getKey();

?>



Bunların dışında komut satırında yazdığınız programlar için de bir UI (User Interface) istiyorsanız her zaman, her yerde olduğu gibi burada da NCURSES yardımınıza koşuyor. Ben henüz NCURSES teknolojisine geçemedim, onu da kavradığım zaman, ona da değinen bir yazı hazırlayacağım.

Kaynakça

  1. http://www.php.net/manual/en/f eatures.commandline.php
  2. http://www.php.net/manual/en/ref.ncurse s.php
  3. #php@irc.freenode.net


Volkan YAZICI
http://linuks.mine.nu/volkany/
PHP

Görüşler

0
anonim
yukaridaki programlarin gercek dosyalarini http://linuks.mine.nu/volkany/tmp/cli_examples/ adresinden de ayrica edinebilirsiniz.
0
oktay
Helal olsun ! Tek basina ogrenip kendi kendine kullanmak yerine herkesle paylasip fikir vermen cok guzel bir davranis.

Makale de gayet profesyonel olmus. Tebrik eder devamini getirecegini umarim.

Oktay
0
m1a2
Bravo Volkan... Şekli, şemali ve içeriğiyle birlikte çok derli toplu bir yazı olmuş... Buradaki öğrenci arkadaşlara yazını özellikle okutacağım, ders almaları için ;) Ha bu arada gentoo`culara inat debian`a devam...
0
FZ
Türk eğitim sistemindeki alabildiğine hoyrat ezberciliğe, üniversiteye hazırlıktaki korkunç beyni-çöplüğe-dönüştürelim-en-çok-kirlenen-kazansın sistemine rağmen hala böyle yaratıcı genç ve liseli arkadaşarımızın olması, araştırma geliştirmeye önem vererek elde ettiklerini düzgün bir şekilde ifade edip bizimle paylaşmaları biraz olsun umutlanmamızı sağlıyor.
0
redial
Elinize Sağlık...
0
anonim
Ugrasina saglik, tam aradigim sorunun cevabini almis oldum. Bu ve bunun gibi-pgp konusu ve debian kurulumu- güzel aciklayici yazilarin arsivlenmesi lazim. (öhö öhö fm adminleri...)
0
anonim
pgp degil de gpg iyidir.. o konuda guzel yazi yazilabilir.. ben anonim takilayim simdilik de o yazi ne oldu diye sormasin arkadaslar.. ama bir ipucu vermeden olmaz :)

debian'a kafam......











...yatmiyor :)

anongyim
0
FZ
Görüş belirtmek için giriş yapın...

İlgili Yazılar

Grafik içinden kod çalıştırma saldırılarıyla ilgili

Yns_

Bir süredir Türkiye'de ve dünyada "hekır"ların ve "skript kidi"lerin rağbet gösterdiği , IE’nin üstün (!) yorumlama zekası sonucu oluşan XSS açıklarına karşı bir PHP sınıfı hazırladım.

Yeni içerik yönetimi programı DCP-Portal

anonim

PHP-Nuke türü içerik yönetimi programlarına bir yenisi daha eklendi. Bir siteyi baştan aşağı gereksiz ayrıntılarla uğraşmanıza gerek kalmadan kurmanıza ve güncellemenize olanak sağlayan bu tür programlar zaten çok az sayıda bulunuyor. dotcom-Projects sahibi Serhan D. Kıymaz tarafından geliştirilen DCP-Portal size bir içerik yönetimi programından beklediğiniz her şeyi sunuyor. Tamamen PHP ve mySQL tabanlı olan DCP-Portal'nin özelliklerinden bazıları şöyle:

Artık Türk Yapımı Bir Forumumuz Var

anonim

Evet artık bizimde kendimize özgü bir forumumuz var. Forumun Adı phpKF (php Kolay Forum). Yapan arkadaş, forumu 6 ayda yaptığını yazmış ve tamamen ücretsiz olarak kaynağını da açmış.

Türkçe Wiki/Blog Melezi Wikepage'in Yeni Sürümü Çıktı

sblisesivdin

Veritabanı gerektirmeyen ve 30K altında büyüklüğe sahip olan wiki/blog melezi wikepage'in yeni sürümü Opus 10 2006.2a çıktı. Çoğunlukla hata giderimi olan sürümde, birkaç ufak özellik de eklenmiş. Ayrıntılı bilgiyi wikepage sitesinde bulabilirsiniz.

Not: Ön tanımlı olarak İngilizce seçili gelen Wikepage'i Türkçe kullanabilmek için aynı sayfadan Türkçe dil dosyasınıda indirmeniz gerekiyor.

PHP ile COM Port Kullanarak Haberleşme

FZ

Türkiye PHP Grubu'ndan Nurettin Sezer'in İzmir Dokuz Eylül Üniversitesi DESEM 'de verilen ücretsiz seminerde bahsettiği konuyla ilgili detaylara buradan erişmek mümkün.