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

Php5 ve Sqlite

GenX

Phpnin tamamiyle kullanima acilmasi beklenen versiyonu PHP 5'in yayindan onceki son deneme surumu "Release Candidate 3" yayinlandi. Peki bize ne gibi getirileri olacak yeni versiyon PHP'nin?

PHP 4.1.0 sonunda hazır

anonim

Çıkacak, çıkıyor derken sonunda PHP'nin yeni sürümü 4.1.0 php.net sitesinden duyuruldu. Mesajı yolladığım şu sıralarda sitede yalnızca kaynak kodu bulunuyor, bu nedenle Windows binary kullanıcılarının biraz daha beklemesi gerekecek.

4.1.0 ile bir çok yeni özellik eklendiği belirtilmiş (henüz kullanma fırsatı bulamadım), bunların arasında beni en çok şaşırtan cümle şu oldu: "We want to thank Brett Brewer and his team in Microsoft for working with us to improve PHP for Windows."

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

Blog tutmanın GMail'cesi

abakana

Bu müthiş icadı yapan kişi Jonathan Hernandez. GMail' de "Starred" durumunda olan mesajlar Blog entrylerini onlara verilen cevaplarda yorumları oluşturuyor. Blog' un diger özellikleri ise, Gmail Label' lari kategoriler olarak değerlendirmesi, GMail davetiyesi olup olmadığını ve blog hesabının Gmailin yüzde kaçını kullandığını belirtmesi oalrak karşımıza çıkıyor.

Bu icadı denemek isteyenler burdan gerekli dosyaları indirip deneyebilir, yaşayan halini görmek isteyenler http://jaws.com.mx/gallina/gallina/index.xml adresini inceleyebilirler.

Editörün Notu: Google sessiz ve derinden evrensel bilgi işlem platformu olma yolunda ilerliyor. Amazon da benzer yolda. İnsan Tim O'Reilly haklı mı acaba diye düşünmeden edemiyor: http://tim.oreilly.com/opensource/paradigmshift_0504.html

MyObjects Zend'in PHP 5 Yarışmasında 7. Oldu

resilence

MySql ve PHP 5 nesne kalıcılık kütüphanesi (Object Persistence Library) uygulaması olan MyObjects, Zend firmasının düzenlediği Php 5 programlama yarışmasında 150'den fazla uygulama içerisinde 7. oldu.

MyObjects BSD lisansı ile dağıtılan bir uygulama, yani ticari olsun ya da olmasın her türlü php uygulaması MyObjects ile geliştirilebilir ya da MyObjects entegre edilerek geliştirilebilir. Uygulamanın genel amaçları ve özellikleri şöyle: