轉載請註明來源: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 d563f9dd480fc255c92ed7963bcc16aa(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 4b823e76639a8f07e14541b26fdfc703 不要忘了給該檔案設定為可執行的權限:$ 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標籤裡認為是語法錯誤):
#!C:\php\php.exe -q
這樣,可以看到在命令列下資訊已經列印出來,證明該CLI腳本已經成功運行。
2.從命令列讀取參數
# 如果想要從命令列取得參數,CLI可以從$_SERVER['argc']和$_SERVER['argv'']取得參數的個數和值。我們再建立一個文件,名字為testargs.php,腳本程式碼如下:
# #!C:\php\php.exe –q 7c560dc230a513d1463dc0fe7a9affe8在命令列輸入如下程式碼: 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 7f729b22353a996a3d8a31bbcc657eb0該腳本執行後將顯示:你好!你叫什麼名字(請輸入):比如,輸入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
按回车键后将出现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命令。
以上就是PHP基础 CLI模式开发不需要任何一种Web服务器的详细介绍的内容,更多相关内容请关注PHP中文网(www.php.cn)!