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

PHP için RPM kütüphanesi

Evreniz

PHP içinden RPM dosyaları hakkında bilgi almak ve başlık bilgileri ile ilgili sorgulamalar yapabilmek için çeşitli fonksiyonlar sunan bir kütüphane (PHP extension), ayrıntılı bilgiye ve kaynak koda, http://cekirdek.uludag.org.tr/~meren/php_rpm/ adresinden ulaşabilirsiniz.

PHP 5.0.0 Çıktı

WoLoLo

php.net 5.0.0 sürümünü çıkardığını duyurdu.
Yeni sürümü Zend Engine II ve komple bir XML desteği sağlıyor. Ayrıca yeni sürümde SQLite adı verilen oldukça kullanışlı bir SQL sürümü ile beraber geliyor.


Download : php 5.0.0
Changelog : Release Candidate 3 > php 5.0.0

PHP5, Zend ve soru işaretleri(m)

junkie

PHP5 ile ilgili dökümanlar çıktıkça meraklandım ve Beta versiyonları ile içine daldım. Ama içine girdikçe, daha fazla soru işareti kafamda yer bulmaya başladı. Özellikle Zend'in yaptığı anketin sonuçlarını açıklamasından sonra.

Acaba Zend PHP5 stratejisi ile ilgili hata mı yaptı? Ya da bu kadar köklü bir değişim böyle bir adımı mı beraberinde getirmeli? Bilemiyorum...

Dünyanın en büyük web sitesi Yahoo!, altyapısını geliştirmek için PHP`ye dönüyor

larweda

www.yahoo.com altında bilinen, internet adına yapılabilecek her türlü içeriği sunan bir web ortamı olan Yahoo!, yıllardır C/C++ ile geliştirilen altyapısını C/C++ ile geliştirmeye devam etmekten vazgeçip, bundan sonraki geliştirmelerini PHP ile yapmaya karar verdiğini duyurdu. (Bunu da Slashdot`tan duydum :-)

Yahoo'nun yüksek (yüksek dediysem, zurnanın sondan kaçıncı deliği olması babında yüksek diyorum :) mühendislerinden biri olan Michael J. Radwin, PHP Con 2002`de yaptığı bir sunumla niçin PHP'yi seçtiklerini, ve bu seçimi yaparken ne aşamalardan geçtiklerini açıklamış.

linux üzerindeki php ile mssql 2000(veya 7.0 veya 6.5...)e bağlanmak istersek

roots

İlla da MySQL kullanacak değilsiniz ya, roots kardeşimiz bize PHP connectivity konusunda bir tecrübesini aktarmış.

Allah oldurmasın ama bir gün icap ederde başınız sıkışırsa ve siz mssql 2000'e linux üzerinde çalışan bir webserverdan php ile bağlanmak zorunda kalırsanız aşağıdakiler sanırım işinize yarayacaktır.

http://www.freetds.com'dan güncel tds sürümünü çekelim. RPM çekebilirsiniz kolay çözüm olarak. Ben tgz olarak indirdim ve...