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 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.

PHP Türkçe Kılavuzu

javamorg

Php.net Türkçe kılavuzu 26 Aralık'tan itibaren yayınlamaya başladı.

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...

Extreme Programming & PHP

SHiBuMi

Extreme Programming, bir anlamda geleneksel yazılım geliştirme metodolojilerine tepki olarak ortaya çıkmış, kodlamayı ön planda tutan, planların her zaman değişikliğe uğramaya mahkum oldukları tecrübesinden yola çıkarak, kodlama ile planlamayı sistem bütünlüğünü tehlikeye atmadan bir arada yürütmeyi hedefleyen bir yazılım geliştirme metodudur. İlk başlarda Smalltalk ile geliştirilen projelerde uygulanmaya başlanmış ve başarı kazanmış bu sistem, bütün programlama dilleri ile uygulanabilir, özellikle günümüzde daha hızlı kod yazımına imkan sağlayan scripting dilleri ile güzel sonuçlar elde edilebilir.

Açık Kaynak Kodlu İçerik Yönetim Sistemlerini Online Görün

anonim

Açık Kaynak Kodlu İçerik Yönetim Sistemlerini indirip yüklemeden Online olarak görüp denemek isteyenler için www.opensourcecms.com sitesi biçilmiş kaftan.. Ayrıca akademisyenlere CMS - e-Learning başlığında Moodle sistemini incelemelerini şiddetle tavsiye ederim. Online ders sistesi hazırlamak gerçekten çok kolay...
www.cmsinfo.org/article.php3?story_id=98 adresinde de güzel bir tartışma var.

Not: İşin açıkçası windows'da çalışan basit bir İçerik Yönetim Sistemi arıyorum. Blog tarzında bir sistemde olsa yeterli olur.
Kişisel kullanım için hangi İçerik Yönetim Sistemi tercih edilmeli ?