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 YAZICISTDIN (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
- http://www.php.net/manual/en/f eatures.commandline.php
- http://www.php.net/manual/en/ref.ncurse s.php
- #php@irc.freenode.net
Volkan YAZICI
http://linuks.mine.nu/volkany/