明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

PHP也可以當(dāng)成Shell Script

[摘要]PHP 怎么這么紅 最近 PHP(Personal Hypertext Preprocessor) 似乎已經(jīng)成了這一兩年來 Linux/Unix 上最廣為大家所使用的網(wǎng)頁處理語言﹐它的方便、強(qiáng)大功能與 OpenSource 的特性使得它正逐漸侵蝕到傳統(tǒng) CGI 甚至是 MicroSoft AS...

   PHP 怎么這么紅
  最近 PHP(Personal Hypertext Preprocessor) 似乎已經(jīng)成了這一兩年來 Linux/Unix 上最廣為大家所使用的網(wǎng)頁處理語言﹐它的方便、強(qiáng)大功能與 OpenSource 的特性使得它正逐漸侵蝕到傳統(tǒng) CGI 甚至是 MicroSoft ASP(Active Server Page)的市場(chǎng)﹐幾乎各大網(wǎng)站征招人才莫不以會(huì) PHP 作為基本條件。
  PHP 確實(shí)有這個(gè)資格可以這么紅﹐原因有下面數(shù)點(diǎn) :
  PHP 是 OpenSource 軟件﹐完全免費(fèi)﹐可以自由散布﹐因此吸引了極多的人來使用﹐也因?yàn)槿绱拴o吸引到了商業(yè)公司為其發(fā)展更好的引擎與最佳化軟件(請(qǐng)參考 http://www.zend.com/)。
  PHP 本身非常簡(jiǎn)單易懂﹐淺顯的指令語法﹐外加一些基本的對(duì)象導(dǎo)向處理能力﹐讓新手足以在最短時(shí)間內(nèi)學(xué)會(huì)。
  PHP 提供了相當(dāng)多的功能﹐包含了數(shù)學(xué)處理、字符串處理、網(wǎng)絡(luò)相關(guān)功能、各種數(shù)據(jù)庫的支持、影像處理功能、有為數(shù)眾多的發(fā)展者正為 PHP 發(fā)展各式各樣的新功能﹐擴(kuò)充性極佳。
  PHP 非常容易與 Apache 相結(jié)合﹐作為 Apache 的模塊來使用﹐設(shè)定安裝上相當(dāng)簡(jiǎn)單﹐也因?yàn)?Apache 目前已經(jīng)占據(jù)了 Web Server 全球 60% 的市場(chǎng)﹐PHP 自然而然成為 Apache 最佳搭配。
  不過﹐這次要講的主題不是 PHP 在網(wǎng)頁設(shè)計(jì)上的應(yīng)用﹐而是 PHP 在 Shell Script 上的應(yīng)用﹐一般所知的 Shell Script 大約就是 tcsh、bash、perl 或是 python 這幾類語言﹐我所要談的就是將 PHP 當(dāng)成 Shell Script 來使用。
  PHP 執(zhí)行檔的安裝
  一般 PHP 作為網(wǎng)頁處理語言都是要編譯成 Apache 的模塊﹐這里當(dāng)然不么做﹐也因此編譯起來很簡(jiǎn)單﹐只要以 root 的身分進(jìn)行如下動(dòng)作 :
  解開 php-3.0.xx.tar.gz
  cd php
  configure
  make
  編譯完之后﹐在 php 目錄下有一個(gè)可執(zhí)行檔﹐檔名為 php﹐將它 copy 到 /usr/local/bin 下即可。注意﹐如果檔案太大﹐可以使用 strip 指令將 php 的方式將不必要的信息去除﹐這樣檔案就會(huì)小得多了。
  第一個(gè)程序
  開始撰寫我們的第一個(gè) PHP Shell Script 程序﹐這個(gè)例子印出 "Hello world !" :
  #!/usr/local/bin/php -q
  <?
  echo "Hello, world !";
  ?>
  注意到 PHP 原本是應(yīng)用在網(wǎng)頁應(yīng)用的﹐因此它內(nèi)定會(huì)送出 HTML 的 HEADER﹐但是在此我們是要將 PHP 用作 Shell Script﹐"-q" 就是表示不要送出 HEADER 的意思﹐你可以試試看不加上 -q 的顯示結(jié)果。
  在這個(gè)例子中﹐/usr/local/bin/php 是表示要執(zhí)行 /usr/local/bin/ 下的 PHP﹐因?yàn)槲覀儎偛艑⑺b在該處。echo 指令將 "Hello, world !" 印出﹐其中的 "" 字符是換行字符。
  注意到在將這個(gè)程序存成檔案后﹐須將其 chmod 成為可執(zhí)行屬性(chmod +x 文件名)﹐然后才能執(zhí)行喔。
  進(jìn)階使用 I
  有時(shí)候我們需要在程序執(zhí)行時(shí)﹐送進(jìn)一些參數(shù)﹐比如說 ls 這個(gè)指令﹐后面可以加上 -l 參數(shù)﹐PHP Shell Script 一樣也有支持這樣的用法﹐有兩個(gè)特殊的變量 : $argc 記錄著后面送入?yún)?shù)的個(gè)數(shù)﹐$argv[] 數(shù)組參數(shù)存著的則是參數(shù)的內(nèi)容。比如說我現(xiàn)在要設(shè)計(jì)一個(gè)算兩個(gè)數(shù)字總和的程序 :
  #!/usr/local/bin/php -q
  <?
  $sum=0;
  $sum=$sum+$argv[1]+$argv[2];
  echo $sum;
  ?>
  假設(shè)將此程序命名為 sum.php3﹐則執(zhí)行 sum.php3 1 2 按下 enter 則會(huì)印出 3。
  如果要算出不特定個(gè)數(shù)的參數(shù)和﹐那么就得要用到 $argc 這個(gè)特殊變量了 :
  #!/usr/local/bin/php -q
  <?
  $sum=0;
  for ($t=1;$t<=$argc;$t++)
  $sum=$sum+$argv[$t];
  echo $sum;
  ?>
  假設(shè)將此程序命名為 bigsum.php3﹐則執(zhí)行 bigsum.php3 1 2 3 4 5 按下 enter 則會(huì)印出 15﹐執(zhí)行 bigsum.php3 1 2 3 4 5 6 按下 enter 則會(huì)印出 21。
  有時(shí)候我們需要在程序執(zhí)行中輸入資料﹐但是 PHP 原本就是用于網(wǎng)頁設(shè)計(jì)﹐而網(wǎng)頁上的資料輸入自然都是用 FORM 的方式來輸入﹐所以這將 PHP 作為 Shell Script 時(shí)問題就來了﹐好在 PHP 有提供了開文件功能﹐而在 Linux/Uinx 之下﹐輸入(input)這件事原本就可以用開檔的方式來完成﹐我們要開啟的是 /dev/stdin 這個(gè)設(shè)備檔(stdin 是表示 standard input 的意思)﹐程序如下 :
  #!/usr/local/bin/php -q
  <?
  $fp=fopen("/dev/stdin","r");
  $inputstr=fgets($fp,100);
  fclose($fp);
  
  echo "\n----------------------\n";
  echo $inputstr;
  ?>
  其中的 fgets($fp,100) 是指從 $fp 這個(gè)檔案(也就是 "/dev/stdin")中讀取出 100 個(gè) byte 的資料﹐程序執(zhí)行到這行便會(huì)停下來等待我們的輸入﹐當(dāng)我們輸入完按下 enter 之后﹐程序就會(huì)將剛才我們輸入的資料給印出來了。
  進(jìn)階使用 II
  雖然已經(jīng)可以處理輸入﹐但是這樣的功能顯然還是太簡(jiǎn)單﹐無法應(yīng)付更大的應(yīng)用﹐比如說我需要一個(gè)功能是將一串資料流(data stream)中的 HTML 給去除﹐這時(shí)便需要完整地處理輸出輸入轉(zhuǎn)向的能力﹐我們可以先設(shè)計(jì)程序如下 :
  #!/usr/local/bin/php -q
  <?
  $fp=fopen("/dev/stdin","r");
  
  while(!feof($fp)) {
  $c=fgetc($fp);
  $inputstr=$inputstr.$c;
  };
  
  fclose($fp);
  
  echo $inputstr;
  ?>
  假設(shè)將此程序命名為 filt.php3﹐如果你直接執(zhí)行這個(gè)程序﹐它會(huì)一直等待你輸入﹐直到你按下 Ctrl+D 后才會(huì)將你的輸入資料給印出﹐我們可以這么執(zhí)行它 :
  more filt.php3 filt.php3
  這樣的做法是將 filt.php3 這個(gè)程序用 more 給秀出并轉(zhuǎn)向給 filt.php3 這個(gè)程序﹐filt.php3 會(huì)不斷接受資料(事實(shí)上就是 filt.php3 程序代碼本身)﹐最后將其印出。
  我們可以在其中加上過濾 HTML 的功能 :
  #!/usr/local/bin/php -q
  <?
  $fp=fopen("/dev/stdin","r");
  
  while(!feof($fp)) {
  $c=fgetc($fp);
  $inputstr=$inputstr.$c;
  };
  
  fclose($fp);
  
  $inputstr=ereg_replace("<([^<>]*)>","",$inputstr);
  
  echo $inputstr;
  ?>
  假設(shè)將此程序命名為 filt2.php3﹐如此一來便完成了過濾功能﹐不信請(qǐng)拿個(gè) HTML 檔來試試看 :
  more xxx.html filt2.php3
  你便會(huì)看到刪除了 HTML TAG 的文件了。
  結(jié)論
  PHP 拿來當(dāng) Shell Script 事實(shí)上相當(dāng)?shù)睾糜茅o原因是 PHP 本身很好學(xué)﹐而且它又支持了各種數(shù)據(jù)庫﹐當(dāng)你已經(jīng)經(jīng)常拿 PHP 來設(shè)計(jì)你的網(wǎng)站之后﹐絕對(duì)不太喜歡再使用其它的 Shell Script 語言來處理其它必須非網(wǎng)頁的部份﹐這時(shí)候拿 PHP 來當(dāng)做 Shell Script 的好處就會(huì)顯現(xiàn)出來了﹐你可以以一貫的方式來發(fā)展整個(gè)系統(tǒng)﹐而不必一下要用 PHP一下又用 Perl/Python 或是 C。
  國(guó)內(nèi)的 PHP 風(fēng)氣已經(jīng)相當(dāng)興盛﹐本站 LinuxFab 便是完全以 PHP 搭配 MySQL 發(fā)展起來的﹐事實(shí)上 PHP 的妙用還有很多﹐有機(jī)會(huì)日后再介紹﹐如果讀者們需要 PHP 的相關(guān)信息﹐歡迎到本站上的 PHP 論壇 參與更多討論。 (出處:Viphot)