Shell Script方式的PHP(轉) 這種方式頗有點像PERL的CGI方式。。:)

來源:互聯網
上載者:User
cgi|perl Shell Script方式的PHP

PHP 怎麼這麼紅  
最近 PHP(Personal Hypertext Preprocessor) 似乎已經成了這一兩年來 Linux/Unix 上最廣為大家所使用的網頁處理語言﹐它的方便、強大功能與 OpenSource 的特性使得它正逐漸侵蝕到傳統 CGI 甚至是 MicroSoft ASP(Active Server Page)的市場﹐幾乎各大網站徵招人才莫不以會 PHP 作為基本條件。  
PHP 確實有這個資格可以這麼紅﹐原因有下面數點 :  
PHP 是 OpenSource 軟體﹐完全免費﹐可以自由散布﹐因此吸引了極多的人來使用﹐也因為如此﹐吸引到了商業公司為其發展更好的引擎與最佳化軟體(請參考 http://www.zend.com/)。  
PHP 本身非常簡單易懂﹐淺顯的指令文法﹐外加一些基本的對象導向處理能力﹐讓新手足以在最短時間內學會。  
PHP 提供了相當多的功能﹐包含了數學處理、字串處理、網路相關功能、各種資料庫的支援、影像處理功能、有為數眾多的發展者正為 PHP 發展各式各樣的新功能﹐擴充性極佳。  
PHP 非常容易與 Apache 相結合﹐作為 Apache 的模組來使用﹐設定安裝上相當簡單﹐也因為 Apache 目前已經佔據了 Web Server 全球 60% 的市場﹐PHP 自然而然成為 Apache 最佳搭配。  
不過﹐這次要講的主題不是 PHP 在網頁設計上的應用﹐而是 PHP 在 Shell Script 上的應用﹐一般所知的 Shell Script 大約就是 tcsh、bash、perl 或是 python 這幾類語言﹐我所要談的就是將 PHP 當成 Shell Script 來使用。  
PHP 執行檔的安裝  
一般 PHP 作為網頁處理語言都是要編譯成 Apache 的模組﹐這裡當然不麼做﹐也因此編譯起來很簡單﹐只要以 root 的身分進行如下動作 :  
解開 php-3.0.xx.tar.gz  
cd php  
configure  
make  
編譯完之後﹐在 php 目錄下有一個可執行檔﹐檔名為 php﹐將它 copy 到 /usr/local/bin 下即可。注意﹐如果檔案太大﹐可以使用 strip 指令將 php 的方式將不必要的資訊去除﹐這樣檔案就會小得多了。  
第一個程式  
開始撰寫我們的第一個 PHP Shell Script 程式﹐這個例子印出 "Hello world !" :  
#!/usr/local/bin/php -q  
<?  
echo "Hello, world !";  
?>  
注意到 PHP 原本是應用在網頁應用的﹐因此它內定會送出 HTML 的 HEADER﹐但是在此我們是要將 PHP 用作 Shell Script﹐"-q" 就是表示不要送出 HEADER 的意思﹐你可以試試看不加上 -q 的顯示結果。  
在這個例子中﹐/usr/local/bin/php 是表示要執行 /usr/local/bin/ 下的 PHP﹐因為我們剛才將它裝在該處。echo 指令將 "Hello, world !" 印出﹐其中的 "" 字元是換行字元。  
注意到在將這個程式存成檔案後﹐須將其 chmod 成為可執行屬性(chmod +x 檔案名稱)﹐然後才能執行喔。  
進階使用 I  
有時候我們需要在程式執行時﹐送進一些參數﹐比如說 ls 這個指令﹐後面可以加上 -l 參數﹐PHP Shell Script 一樣也有支援這樣的用法﹐有兩個特殊的變數 : $argc 記錄著後面送入參數的個數﹐$argv[] 數組參數存著的則是參數的內容。比如說我現在要設計一個算兩個數字總和的程式 :  
#!/usr/local/bin/php -q  
<?  
$sum=0;  
$sum=$sum+$argv[1]+$argv[2];  
echo $sum;  
?>  
假設將此程式命名為 sum.php3﹐則執行 sum.php3 1 2 按下 enter 則會印出 3。  
如果要算出不特定個數的參數和﹐那麼就得要用到 $argc 這個特殊變數了 :  
#!/usr/local/bin/php -q  
<?  
$sum=0;  
for ($t=1;$t<=$argc;$t++)  
$sum=$sum+$argv[$t];  
echo $sum;  
?>  
假設將此程式命名為 bigsum.php3﹐則執行 bigsum.php3 1 2 3 4 5 按下 enter 則會印出 15﹐執行 bigsum.php3 1 2 3 4 5 6 按下 enter 則會印出 21。  
有時候我們需要在程式執行中輸入資料﹐但是 PHP 原本就是用於網頁設計﹐而網頁上的資料輸入自然都是用 FORM 的方式來輸入﹐所以這將 PHP 作為 Shell Script 時問題就來了﹐好在 PHP 有提供了開檔案功能﹐而在 Linux/Uinx 之下﹐輸入(input)這件事原本就可以用開檔的方式來完成﹐我們要開啟的是 /dev/stdin 這個裝置檔(stdin 是表示 standard input 的意思)﹐程式如下 :  
#!/usr/local/bin/php -q  
<?  
$fp=fopen("/dev/stdin","r");  
$inputstr=fgets($fp,100);  
fclose($fp);  

echo " ---------------------- ";  
echo $inputstr;  
?>  
其中的 fgets($fp,100) 是指從 $fp 這個檔案(也就是 "/dev/stdin")中讀取出 100 個 byte 的資料﹐程式執行到這行便會停下來等待我們的輸入﹐當我們輸入完按下 enter 之後﹐程式就會將剛才我們輸入的資料給印出來了。  
進階使用 II  
雖然已經可以處理輸入﹐但是這樣的功能顯然還是太簡單﹐無法應付更大的應用﹐比如說我需要一個功能是將一串資料流(data stream)中的 HTML 給去除﹐這時便需要完整地處理輸出輸入轉向的能力﹐我們可以先設計程式如下 :  
#!/usr/local/bin/php -q  
<?  
$fp=fopen("/dev/stdin","r");  

while(!feof($fp)) {  
$c=fgetc($fp);  
$inputstr=$inputstr.$c;  
};  

fclose($fp);  

echo $inputstr;  
?>  
假設將此程式命名為 filt.php3﹐如果你直接執行這個程式﹐它會一直等待你輸入﹐直到你按下 Ctrl+D 後才會將你的輸入資料給印出﹐我們可以這麼執行它 :  
more filt.php3 | filt.php3  
這樣的做法是將 filt.php3 這個程式用 more 給秀出並轉向給 filt.php3 這個程式﹐filt.php3 會不斷接受資料(事實上就是 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;  
?>  
假設將此程式命名為 filt2.php3﹐如此一來便完成了過濾功能﹐不信請拿個 HTML 檔來試試看 :  
more xxx.html | filt2.php3  
你便會看到刪除了 HTML TAG 的檔案了。  
結論  
PHP 拿來當 Shell Script 事實上相當地好用﹐原因是 PHP 本身很好學﹐而且它又支援了各種資料庫﹐當你已經經常拿 PHP 來設計你的網站之後﹐絕對不太喜歡再使用其它的 Shell Script 語言來處理其它必須非網頁的部份﹐這時候拿 PHP 來當做 Shell Script 的好處就會顯現出來了﹐你可以以一貫的方式來發展整個系統﹐而不必一下要用 PHP一下又用 Perl/Python 或是 C。

相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。