摘要:PHP CLI模式開發不須要任何一種Web服務器(包括Apache或MS IIS等),這樣,CLI能夠運行在各類場合。 有兩種方法能夠運行PHP CLI腳本。...轉載請註明來源:PHP基礎: CLI模式開發不須要任何一種Web服務器php
PHP CLI模式開發不須要任何一種Web服務器(包括Apache或MS IIS等),這樣,CLI能夠運行在各類場合。html
有兩種方法能夠運行PHP CLI腳本。shell
第一種方法是使用php -f /path/to/yourfile.php。調用PHP CLI解釋器,並給腳本傳遞參數。這種方法首先要設置php解釋器的路徑,Windows平臺在運行CLI以前,需設置相似path c:\php的命令,也失去了CLI腳本第一行的意義,所以不建議使用該方法。數組
第二種方法是首先運行chmod+x <要運行的腳本文件名>(UNIX/Linux環境),將該PHP文件置爲可執行權限,而後在CLI腳本頭部第一行加入聲明(相似於#! /usr/bin/php或PHP CLI解釋器位置),接着在命令行直接執行。這是CLI首選方法,建議採用。bash
下面咱們來看看怎樣編寫PHP CLI腳本。服務器
1.編寫第一個CLI腳本編輯器
首先建立一個名爲myfile.php的PHP腳本,用於運行PHP CLI。該腳本很簡單,僅顯示「你好 PHP CLI!」。該腳本代碼以下:函數
#!/usr/local/bin/php –q 不要忘了給該文件設置爲可執行的權限:$ chmod 755 myfile.php而後直接輸入如下命令,按回車鍵便可以運行:$ ./myfile.php 若是要在Windows系統下運行該腳本,則不須要設置文件屬性,能夠直接運行該腳本。Microsoft Windows [版本 6.0.6000] 版權全部 (C) 2006 Microsoft Corporation。保留全部權利。C:\ >myfile.php你好 PHP CLI!測試
再重申一次:若是在Windows平臺,CLI腳本的第一行必定要寫正確php.exe所在的位置,像這樣(另外,若是要在CLI腳本中加註釋語句,則要把註釋寫在PHP標籤裏面,由於CLI解釋只認識第一行,不在PHP標籤裏認爲是語法錯誤):ui
#!C:\php\php.exe -q
這樣,能夠看到在命令行下信息已經打印出來,證實該CLI腳本已經成功運行。
2.從命令行上讀取參數
若是想從命令行獲取參數,CLI能夠從$_SERVER['argc']和$_SERVER['argv'']取得參數的個數和值。咱們再創建一個文件,名字爲testargs.php,腳本代碼以下:
#!C:\php\php.exe –q 在命令行輸入以下代碼: C:\Users\John>testargs.php Always To Be Best測試獲取參數:4AlwaysToBeBest
由於咱們輸入了一串單詞,爲「Always To Be Best」,腳本參數以空格分隔。所以,PHP將其計爲4個參數,下面對此說明。
$_SERVER["argc"]數組返回一個整型的數,表明從命令行上回車後一共輸入了幾個參數。
從上例的結果已經看出,要訪問已經傳入的參數值,須要從索引1開始。由於腳本自己的文件已經佔用了索引0,即$_SERVER["argv"][0]。
3.處理I/O通道
PHP最初設計不是用於與用戶直接的鍵盤輸入或文本輸出結合使用。瞭解這一設計是相當重要的,由於若是須要在命令行中執行任何操做,都必須可以與用戶來回通訊。
輸入輸出(I/O)通道這個思想來源於UNIX系統,UNIX系統提供3個文件句柄,用以從一個應用程序及用戶終端發送和接收數據。
咱們能夠把一個腳本的輸出重定向到一個文件:
php world.php > outputfile
若是是在UNIX系統下,也可使用通道定向到另外一個命令或應用程序中。例如:
php world.php | sort.
在PHP 5 CLI中,有一個文件流句柄,可使用3個系統常量,分別爲STDIN、STDOUT和STDERR。下面咱們分別介紹。
(1)STDIN
STDIN全稱爲standard in或standard input,標準輸入能夠從終端取得任何數據。
格式:stdin (’php://stdin’)
下面的例子是顯示用戶輸入:
#!/usr/local/bin/php -q
這段代碼的工做原理與cat命令很類似,迴轉提供給它的全部輸入。可是,這時它還不能接收參數。
STDIN是PHP的標準輸入設備,利用它,CLI PHP腳本能夠作更多的事情。以下面例子:
#!/usr/local/bin/php -q 該腳本執行後將顯示:你好!你叫什麼名字(請輸入):好比,輸入Raymond以後,將顯示:歡迎你Raymond
(2)STDOUT
STDOUT全稱爲standard out或standard output,標準輸出能夠直接輸出到屏幕(也能夠輸出到其餘程序,使用STDIN取得),若是在PHP CLI模式裏使用print或echo語句,則這些數據將發送到STDOUT。
格式:stdout (’php://stdout’)
咱們還可使用PHP函數進行數據流輸出。以下面例子:
#!/usr/local/bin/php –q輸出結果以下:Hello World例如,echo和print命令打印到標準輸出。 #!/usr/local/bin/php –qOutput #1.這將獲得:Output #1.Output #2.Output #3.
說明:PHP標記外的新行已被輸出,可是echo命令或print命令中沒有指示換行。事實上,命令提示符從新出如今Output #2.Output #3. 所在的行中。PHP擁有的任何其餘打印函數將會像此函數同樣運行正常,任何寫回文件的函數也是同樣的。
#!/usr/local/bin/php -q
以上代碼將把php://stdout做爲輸出通道顯式打開,而且php://output一般以與php://stdout相同的方法運行。
(3)STDERR
STDERR全稱爲standard error,在默認狀況下會直接發送至用戶終端,當使用STDIN文件句柄從其餘應用程序沒有讀取到數據時會生成一個「stdin.stderr」。
格式:stderr (’php://stderr’)
下面的腳本表示如何把一行文本輸出到錯誤流中。
#!/usr/local/bin/php –q
PHP 5.2能夠直接使用STDOUT做爲常量,而不是定義上面使用的變量$STDOUT,爲了兼容以前版本,咱們仍使用了自定義變量,若是您使用的是PHP 5.2,則能夠參考STDIN的第二個例子。
4.後臺運行CLI
若是正在運行一個進程,並且在退出帳戶時該進程還不會結束,即在系統後臺或背景下運行,那麼就可使用nohup命令。該命令能夠在退出帳戶以後繼續運行相應的進程。
nohup在英文中就是不掛起的意思(no hang up)。該命令的通常形式爲:
nohup –f scriptname.php &
使用nohup命令提交做業,在默認狀況下該做業的全部輸出都被重定向到一個名爲nohup.out的文件中,除非另外指定了輸出文件。
nohup scriptname.php > log.txt &
這樣,PHP CLI腳本執行後的結果將輸出到log.txt中,咱們可使用tail命令查看該內容:
tail -n50 -f log.txt
如今再來實現兩個例子,第一個是每隔10分鐘自動生成一個靜態HTML文件,並一直執行下去。腳本代碼以下:
#! /usr/local/bin/php
保存而且退出vi編輯器,而後賦予genHTML.php文件可執行權限:
#>chmod 755 genHTML.php 而後讓腳本在後臺執行,執行以下命令:$nohup genHTML.php –f &執行上述命令後出現以下提示:[1] 16623
按回車鍵後將出現shell提示符。上面的提示就是說,全部命令執行的輸出信息都會放到nohup.out文件中。
執行上面命令後,每隔10分鐘就會在指定的目錄生成指定的HTML文件,如article_111990120.html等文件。
如何終止CLI程序的後臺運行呢?
可使用kill命令來終止這個進程,終止進程以前要知道進程的PID號,即進程ID,咱們使用ps命令:
www# ps PID TT STAT TIME COMMAND 561 v0 Is+ 0:00.00 /usr/libexec/getty Pc ttyv0 562 v1 Is+ 0:00.00 /usr/libexec/getty Pc ttyv1 563 v2 Is+ 0:00.00 /usr/libexec/getty Pc ttyv2 564 v3 Is+ 0:00.00 /usr/libexec/getty Pc ttyv3 565 v4 Is+ 0:00.00 /usr/libexec/getty Pc ttyv4 566 v5 Is+ 0:00.00 /usr/libexec/getty Pc ttyv5 567 v6 Is+ 0:00.00 /usr/libexec/getty Pc ttyv6 568 v7 Is+ 0:00.00 /usr/libexec/getty Pc ttyv7 16180 p0 I 0:00.01 su 16181 p0 S 0:00.06 _su (csh) 16695 p0 R+ 0:00.00 ps 16623 p0 S 0:00.06 /usr/local/bin/php /usr/local/www/data/genHTML.php 已經看到PHP的進程ID是:16623,因而再執行kill命令:$ kill -9 16623 [1]+ Killed nohup /usr/local/www/data/genHTML.php 這時該命令的進程就已經被終止了,再使用ps命令:$ ps PID TT STAT TIME COMMAND 82374 p3 Ss 0:00.17 -bash (bash) 82535 p3 R+ 0:00.00 ps
剛纔的PHP CLI腳本已經沒有了,若是直接運行ps命令沒法看到進程,那麼就結合使用ps & apos兩個命令來查看。
注意:上面例子必須運行在UNIX或者Linux系統中,美源星如FreeBSD、Redhat Linux等,在Windows環境不支持nohup命令。
blog.itpub.net/30065054/viewspace-2126208
blog.chinaunix.net/uid-30065054-id-5753261.html
www.niuche.com/article/1139135.html
www.niuche.com/article/1139141.html
www.365128.com/user/myx2/10.html
www.365128.com/user/myx2/11.html
www.365128.com/user/myx2/12.html
www.365128.com/user/myx2/13.html
www.365128.com/user/myx2/14.html
www.365128.com/user/myx2/15.html
www.365128.com/user/myx2/16.html