PHP CLI模式開發不須要任何一種Web服務器(包括Apache或MS IIS等),這樣,CLI能夠運行在各類場合。
有兩種方法能夠運行PHP CLI腳本。php
第一種方法是使用 # php /path/to/yourFile.php 調用PHP CLI解釋器,並給腳本傳遞參數。這種方法要指定php解釋器的路徑。
第二種方法是首先運行chmod +x <要運行的腳本文件名>(UNIX/Linux環境),將該PHP文件置爲可執行權限,而後在CLI腳本頭部第一行加入聲明(相似於#! /usr/bin/php 或 PHP CLI 解釋器位置),接着在命令行直接執行。html
1、從命令行上讀取參數
若是想從命令行獲取參數,CLI能夠從 $_SERVER['argv'] 和 $_SERVER['argc'] 取得參數的值和參數個數。
咱們創建一個文件,名字爲 cliPHP1.php 腳本代碼以下:數組
#! /usr/local/php/bin/php -q <?php /** * PHP CLI帶有兩個特殊的變量,專門用來達到這個目的: * 一個是 $_SERVER['argv'] 變量,它經過命令行把傳遞給PHP腳本的參數保存爲單獨的數組元素; * 另外一是 $_SERVER['argc'] 變量,它用來保存$_SERVER['argv']數組裏元素的個數。 * * * 運行效果: * # /usr/local/php/bin/php ./cliPHP1.php aa bb cc * Array * ( * [0] => ./cliPHP1.php ---> 0 指當前腳本名稱 * [1] => aa --------------> 1 第1個參數 * [2] => bb --------------> 2 第2個參數 * [3] => cc --------------> n 第n個參數 * ) * number: 4 -----------------> 參數數量 * */ ini_set('error_reporting', 'E_ALL & ~E_NOTICE'); //設置錯誤報告模式 $argv = $_SERVER['argv']; //獲取參數(array 數組) $argc = $_SERVER['argc']; //獲取參數數量(integer 整數) print_r($argv); echo 'number: '.$argc; echo "\r\n"; ?>
2、處理I/O通道
PHP最初設計不是用於與用戶直接的鍵盤輸入或文本輸出結合使用。瞭解這一設計是相當重要的,由於若是須要在命令行中執行任何操做,都必須可以與用戶來回通訊。
輸入輸出(I/O)通道這個思想來源於UNIX系統,UNIX系統提供3個文件句柄,用以從一個應用程序及用戶終端發送和接收數據。服務器
咱們能夠把一個腳本的輸出重定向到一個文件,例如:
# php world.php > outputfile編輯器
若是是在UNIX系統下,也能夠使用通道定向到另外一個命令或應用程序中。例如:
# php world.php | sortspa
在PHP 5 CLI中,有一個文件流句柄,能夠使用3個系統常量,分別爲 STDIN、 STDOUT 和 STDERR。下面咱們分別介紹。命令行
(1) STDIN
STDIN 全稱爲 standard in 或 standard input 標準輸入能夠從終端取得任何數據。設計
(2) STDOUT
STDOUT 全稱爲 standard out 或 standard output 標準輸出能夠直接輸出到屏幕(也能夠輸出到其餘程序,使用STDIN取得),若是在PHP CLI模式裏使用print或echo語句,則這些數據將發送到STDOUT。code
(3) STDERR
STDERR 全稱爲 standard error 在默認狀況下會直接發送至用戶終端,當使用STDIN文件句柄從其餘應用程序沒有讀取到數據時會生成一個「stdin.stderr」。server
咱們創建一個文件,名字爲 cliPHP2.php 腳本代碼以下:
#! /usr/local/php/bin/php -q <?php /** * 本例是一個CLI與用戶交互腳本,讓其輸出用戶名與年齡並輸出 * 標準輸出: fwrite(STDOUT,'請輸出用戶名:') //輸出內容 * 標準輸入: fgets(STDIN) //獲取用戶輸入的內容 * 標準錯誤輸出: fwrite(STDERR,'錯誤:xxxxx') //輸出錯誤信息 * * 運行效果: * [root@zzx tmp]# /usr/local/php/bin/php /wwwroot/test/httpsqs/cliPHP.php * Enter your name: * Enter your name:zhangsan * Enter your age:abc * Notice: age must be an integer,try again! * Enter your age:aaa * Notice: age must be an integer,try again! * Enter your age:22 * Hello zhangsan, your age is 22 */ $name = ''; $age = ''; while(true){ fwrite(STDOUT,"Enter your name:"); //標準輸出,等待用戶輸入用戶名 $name = trim(fgets(STDIN)); //標準輸入,當即獲取用戶名 if(!empty($name)){ break 1; } } while(true){ fwrite(STDOUT,"Enter your age:"); $age = trim(fgets(STDIN)); if(empty($age)){ continue 1; } $matchNum = preg_match('/^\d+$/',$age); //驗證整型,獲取匹配次數 if($matchNum == 0){ fwrite(STDERR,"Notice: age must be an integer,try again!\r\n"); }else{ break 1; } } //do something here... $outStr = "Hello $name, your age is $age"; fwrite(STDOUT,$outStr); echo "\n\n"; ?>
3、用 nohup 後臺運行CLI
若是正在運行一個進程,並且在退出帳戶時該進程還不會結束,即在系統後臺或背景下運行,那麼就能夠使用nohup命令。該命令能夠在退出帳戶以後繼續運行相應的進程。
nohup在英文中就是不掛起的意思(no hang up)。該命令的通常形式爲:
# nohup <腳本名.php> &
使用nohup命令提交做業,在默認狀況下該做業的全部輸出都被重定向到一個名爲 nohup.out 的文件中,除非另外指定了輸出文件:
# nohup /usr/local/php/bin/php ./scriptName.php 1>/tmp/log.txt & 將標準輸出重定向到log.txt # nohup /usr/local/php/bin/php ./scriptName.php 1>/tmp/log.txt 2>/tmp/err.txt & 將標準輸出重定向到/tmp/log.txt 錯誤輸出重定向到/tmp/err.txt # nohup /usr/local/php/bin/php ./scriptName.php 1>/tmp/log.txt 2>&1 & 將標準輸出重定向到/tmp/log.txt 而後再將標準錯誤輸出重定向到標準輸出,即:二者一塊兒重定向到/tmp/log.txt # nohup /usr/local/php/bin/php ./scriptName.php 1>/dev/null 2>&1 & 將標準輸出和錯誤輸出一塊兒到重定向到/dev/null
這樣,PHP CLI腳本執行後的結果將輸出到log.txt中,咱們能夠使用tail命令動態查看內容:
# tail -f -n20 /tmp/log.txt
如今再來實現一個例子,是每隔10秒鐘自動生成一個靜態HTML文件,並一直執行下去。腳本代碼以下:
腳本名稱: cliPHP3.php
#! /usr/local/php/bin/php -q <?php /** * 本例是每隔10秒鐘自動生成一個靜態HTML文件,並一直執行下去 */ while(true){ file_put_contents("/tmp/article_".time().".html",date('Y-m-d H:i:s')); sleep(10); //10秒 (單位: 秒) //usleep(1000000 * 0.5); //0.5秒(單位: 微秒 注: 1000000微秒=1秒) } ?>
保存而且退出vi編輯器,而後賦予 genHTML.php 文件可執行權限,並執行(在Linux命令行下執行腳本建議寫絕對路徑,這是良好習慣):
# chmod 755 cliPHP3.php
# nohup /usr/local/php/bin/php /wwwroot/httpsqs/cliPHP3.php 1>/dev/null 2>&1 &
執行上述命令後出現以下提示:[2] 3300
在當前會話下,使用jobs命令能夠查看全部後臺運行的全部進程:
# jobs
[1]- Running nohup /usr/local/php/bin/php /wwwroot/httpsqs/usage_server.php > /opt/httpsqs/data/log.txt 2> /opt/httpsqs/data/err.txt &
[2]+ Running nohup /usr/local/php/bin/php /wwwroot/httpsqs/cliPHP3.php > /dev/null 2>&1 &
如何終止CLI程序的後臺運行呢?
使用 # ps aux 可查看當前系統全部進程,使用grep過濾選項便可,以下:
# ps aux | grep php
root 3227 0.1 1.6 106796 8408 pts/3 S 06:03 0:02 /usr/local/php/bin/php /wwwroot/httpsqs/usage_server.php
root 3300 0.0 1.5 106796 8080 pts/3 S 06:39 0:00 /usr/local/php/bin/php /wwwroot/httpsqs/cliPHP3.php
root 3312 0.0 0.1 5980 744 pts/4 S+ 06:41 0:00 grep php
可以輕鬆找到 /wwwroot/httpsqs/cliPHP3.php 對應的PID爲3300,使用kill命令殺死進程便可:# kill 3300