PHP基礎知識:CLI模式開發不需要任何一種Web伺服器
PHP
CLI模式開發不需要任何一種Web伺服器(包括Apache或MS IIS等),這樣,CLI可以執行在各種場合。
有兩種方法可以執行PHP CLI指令碼。
第一種方法是使用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首選方法,建議採用。
下面我們來看看怎樣編寫PHP CLI指令碼。
1.編寫第一個CLI指令碼
首先建立一個名為myfile.php的PHP指令碼,用於執行PHP
CLI。該指令碼很簡單,僅顯示“你好 PHP CLI!”。該指令碼程式碼如下:
#!/usr/local/bin/php –q <?php//Windows平臺上,上行應該為:#!C:\php\php.exe -qecho "你好 PHP CLI!";?> 不要忘了給該檔案設定為可執行的許可權:$ chmod 755 myfile.php然後直接輸入以下命令,按Enter鍵即可以執行:$ ./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標籤裡認為是語法錯誤):
#!C:\php\php.exe -q
這樣,可以看到在命令列下資訊已經列印出來,證明該CLI指令碼已經成功執行。
2.從命令列上讀取引數
如果想從命令列獲取引數,CLI可以從$_SERVER['argc']和$_SERVER['argv'']取得引數的個數和值。我們再建立一個檔案,名字為testargs.php,指令碼程式碼如下:
#!C:\php\php.exe –q <?php//UNIX和Linux平臺下應該為#!/usr/local/bin/php –qecho "測試獲取引數:\n"; echo $_SERVER["argc"]."\n";//顯示傳入的引數值,從索引1開始顯示echo $_SERVER["argv"][1]."\n"; echo $_SERVER["argv"][2]."\n";echo $_SERVER["argv"][3]."\n"; echo $_SERVER["argv"][4]."\n";?>在命令列輸入如下程式碼: 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<?php $file = file_get_contents("php://stdin", "r");echo $file;?>
這段程式碼的工作原理與cat命令很相似,迴轉提供給它的所有輸入。但是,這時它還不能接收引數。
STDIN是PHP的標準輸入裝置,利用它,CLI PHP指令碼可以做更多的事情。如下面例子:
#!/usr/local/bin/php -q <?php//UNIX平臺下第一行應該為#!/usr/bin/php –q/* 如果STDIN未定義,將新定義一個STDIN輸入流 */ if(!defined("STDIN")) {define("STDIN", fopen('php://stdin','r'))} echo "你好!你叫什麼名字(請輸入):\n";$strName = fread(STDIN, 100); //從一個新行讀入80個字元 echo '歡迎你'.$strName."\n";?>該指令碼執行後將顯示:你好!你叫什麼名字(請輸入):比如,輸入Raymond之後,將顯示:歡迎你Raymond
(2)STDOUT
STDOUT全稱為standard
out或standard output,標準輸出可以直接輸出到螢幕(也可以輸出到其他程式,使用STDIN取得),如果在PHP
CLI模式裡使用print或echo語句,則這些資料將傳送到STDOUT。
格式:stdout (’php://stdout’)
我們還可以使用PHP函式進行資料流輸出。如下面例子:
#!/usr/local/bin/php –q<?php $STDOUT = fopen('php://stdout', 'w');fwrite($STDOUT,"Hello World"); fclose($STDOUT);?>輸出結果如下:Hello World例如,echo和print命令列印到標準輸出。 #!/usr/local/bin/php –qOutput #1.<?phpecho "Output #2.";print "Output #3." ?>這將得到:Output #1.Output #2.Output #3.
說明:PHP標記外的新行已被輸出,但是echo命令或print命令中沒有指示換行。事實上,命令提示符重新出現在Output #2.Output #3. 所在的行中。PHP擁有的任何其他列印函式將會像此函式一樣執行正常,任何寫回檔案的函式也是一樣的。
#!/usr/local/bin/php -q <?php$STDOUT = fopen("php://stdout", "w");fwrite($STDOUT, "Output #1."); fclose($STDOUT);?>
以上程式碼將把php://stdout作為輸出通道顯式開啟,並且php://output通常以與php://stdout相同的方法執行。
(3)STDERR
STDERR全稱為standard
error,在預設情況下會直接傳送至使用者終端,當使用STDIN檔案控制程式碼從其他應用程式沒有讀取到資料時會生成一個“stdin.stderr”。
格式:stderr (’php://stderr’)
下面的指令碼表示如何把一行文字輸出到錯誤流中。
#!/usr/local/bin/php –q<?php $STDERR = fopen('php://stderr', 'w');fwrite($STDERR,"There was an Error"); fclose($STDERR);?>
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 <?phpset_time_limit(0);while(true){@fopen("/usr/local/www/data-dist/content/ article_".time().".html","w");sleep(600);}?>
儲存並且退出vi編輯器,然後賦予genHTML.php檔案可執行許可權:
#>chmod 755 genHTML.php 然後讓指令碼在後臺執行,執行如下命令:$nohup genHTML.php –f &執行上述命令後出現如下提示:[1] 16623
按Enter鍵後將出現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命令。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30065054/viewspace-2126571/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PHP基礎知識PHP
- PHP物件基礎知識PHP物件
- PHP 基礎知識-1PHP
- Web測試基礎-Html基礎知識WebHTML
- PHP基礎知識——PHP偽協議PHP協議
- Web前端基礎知識整理Web前端
- 適用於 PHP 開發人員的 Python 基礎知識PHPPython
- iOS 開發:『Runtime』詳解(一)基礎知識iOS
- 伺服器基礎知識伺服器
- 必知必會的Node-CLI開發基礎
- 安卓(Android)開發基礎知識安卓Android
- app,小程式開發基礎知識APP
- 【爬蟲】第一章-Web基礎知識爬蟲Web
- JS基礎知識梳理彙總 如何能學好Web前端開發JSWeb前端
- 影片基礎知識(一)
- React基礎知識(一)React
- py基礎知識(一)
- 小程式開發之基礎知識(0)
- 前端開發基礎知識整理–css篇前端CSS
- 一文了解.Net Core 3.1 Web API基礎知識WebAPI
- python,函式各種基礎知識Python函式
- PHP 開發基礎PHP
- 【知識分享】 伺服器基礎知識【初學者必看】伺服器
- PHP 轉 Node 筆記(二. 基礎的Web開發)PHP筆記Web
- CTF | Web安全 Part1:基礎知識Web
- WEB網路滲透的基礎知識Web
- 《Web 自動化》基礎知識腦圖Web
- Java併發--基礎知識Java
- 遊戲開發3D基礎知識遊戲開發3D
- 爬蟲開發知識入門基礎(1)爬蟲
- zookeeper基礎知識分享(一)
- JavaSE基礎知識分享(一)Java
- hadoop基礎知識分享(一)Hadoop
- MySQL基礎知識分享(一)MySql
- Java併發程式設計——基礎知識(一)Java程式設計
- SAP SD基礎知識之銷售模式模式
- Android基礎知識:Service(3)啟動模式Android模式
- 【Python培訓基礎知識】單例模式Python單例模式
- 【知識分享】伺服器的防護幾種模式伺服器模式