OS:RedHat Linux 5
最近在弄php。和J2EE那一套比較起來,個人感覺php要輕便適手許多。
單配置而言,Linux環境下需要apache以及php,當前最新版本的為5.3.6。但是建議使用5.2或者更早的,新版本目前還不算穩定,某些方法的使用可能會有點版本兼容問題,譬如各種時間函數,還有部分字符串處理如split()等。
相對於java開發環境,簡單得操蛋。
在windows環境下有很多集成php開發工具,wamp是目前所見最易上手的。它集成了php、apache以及MySql,統統一鍵搞定。
好了,正題。
php調用命令行的常用方法包括:exec,system,shell_exec,passthru()。
===================來自百度的分界線================
system() 輸出並返回最后一行shell結果。
exec() 不輸出結果,返回最后一行shell結果,所有結果可以保存到一個返回的數組里面。
passthru() 只調用命令,把命令的運行結果原樣地直接輸出到標准輸出設備上。
shell_exec() 命令行實際上僅是反撇號 (`) 操作符的變體。如果您編寫過 shell 或 Perl 腳本,您就知道可以在反撇號操作符內部捕捉其他命令的輸出。
==============================================
在這里最好用的莫過於shell_exec()。
上面說了,那應該能想到,shell_exec()有最直接的引用返回方法,如下:
CODE:
$result=shell_exec("ls");
print $result;
打印用戶目錄(因為默認的執行目錄就是用戶目錄“~”)下的所有文件、目錄名。
我們可以簡化一下,如下:
CODE:
$result=`ls`;
print $result;
print `ls`;
注意,“ ` ”這個符號是反撇號,在大鍵盤數字鍵“1”的左側的那個。
兩個print都會輸出同樣的結果。
好的東西總是有缺陷的,不然我會說它是完美的東西,shell_exec()不能返回錯誤。
而system就能做到。如下:
CODE:
system("ls",$sto);
print $sto;
如果太過於熟悉java開發,這里的$sto可以視為java的傳引用。$sto的返回值是為整數,0為命令通過,不為0則是錯誤號碼返回。目前我僅僅關注了權限,可知返回值1表示權限問題: Permission denied。
system的使用也會產生問題,如下:
CODE:
print system("ls",$sto);
該行語句會將用戶目錄下的所有文件、目錄名打印兩遍。
這是因為system本身的功能就是“字符串轉化為輸入流,執行,輸出流轉化字符串,打印”,你可以把system視作exec和print的合體。
從這里我們知道,集合的不一定是好的,缺乏靈活性。
所以,這種情況下還是建議使用exec,使用方法同system。
這是一些基本的使用,現在來總結下開發中遇到的問題。
1、php 5.3.6的命令行格式。你可能會需要使用sudo touch newfile.txt,為了適用不同環境,你可能會把它整成 /usr/bin/sudo /bin/touch newfile.txt。
那好,你完了。它不會被執行。
奇怪的事情發生了,假如,默認的conf可以識別touch,而不需加入絕對路徑,php 5.3.6就不允許你在工具引用命令上加入絕對路徑。這點很奇怪,在使用php 5.2的時候並沒有出現這種問題。
你需要寫成:/usr/bin/sudo touch newfile.txt
同樣的,假如,你要整一個邏輯單元,使用sudo lvm lvcreate命令
第二個lvm不需要,也請不要使用,php 5.3.6在調用第二層工具的時候也會出現同樣的問題,目前本人還沒研究出原因。
sudo lvcreate已經夠用了。
2、php 5.3.6對split()做了改寫,如果你想實現分割字符串的功能,請盡量使用explode()。
3、關於sudo的配置,這個是通用問題。只要涉及到頁面調用命令行,就一定會有權限問題。
你敢給界面用戶命令行root權限么?那,還是老老實實配置sudo吧。
visudo是個很好用的工具,它會檢測你對/etc/sudoers的改寫,當不能正確解析時候,visudo會報告問題。當然如果你非要堅持vi /etc/sudoers,誰也不能阻止你發瘋,是不是?
#visudo
加入下面這行:
myusr ALL=(ALL)NOPASSWD:ALL
myusr表示你要賦予sudo權限的用戶名,第一個ALL表示,給所有訪問端口同樣的權限,它的選項可以有LOCAL,NETWORK等。
之后的NOPASSWD表示,在使用sudo時候不需要密碼驗證。括號里的ALL,由於本人比較懶,還沒研究……
冒號后面還有個ALL,這是說,你要賦予sudo權限的命令集。ALL指代全部命令,你可以在后面添加單一的命令,或者整個命令文件夾。
注意:有時候你會發現,即時使用了sudo,在頁面調用命令時還是會報出權限錯誤,這很可能是因為tty驗證。注意某一行(Defaults requiretty),用#注釋掉,就可以了。