PHP命令行下的世界 原

PHP作爲一門web開發語言,通常情況下我們都是在Web Server中運行PHP,使用瀏覽器訪問,因此很少關注其命令行操作以及相關參數的使用,但是,特別是在類Unix操作系統上,PHP可以作爲一門腳本語言執行與shell類似的處理任務。

##php命令行(CLI)參數詳解

查看PHP的所有命令行參數,使用php -h命令。我們將會對大部分常用的命令行參數進行一一解釋,以加深對PHP能力的認識,更加快捷的在服務端命令行下使用PHP或者調試各種因爲對環境不熟悉而出現的問題。

-a               以交互式shell模式運行
-c <path>|<file> 指定php.ini文件所在的目錄
-n               指定不使用php.ini文件
-d foo[=bar]     定義一個INI實體,key爲foo,value爲'bar'
-e               爲調試和分析生成擴展信息
-f <file>        解釋和執行文件<file>.
-h               打印幫助
-i               顯示PHP的基本信息
-l               進行語法檢查 (lint)
-m               顯示編譯到內核的模塊
-r <code>        運行PHP代碼<code>,不需要使用標籤 <?..?>
-B <begin_code>  在處理輸入之前先執行PHP代碼<begin_code>
-R <code>        對輸入的沒一行作爲PHP代碼<code>運行
-F <file>        Parse and execute <file> for every input line
-E <end_code>    Run PHP <end_code> after processing all input lines
-H               Hide any passed arguments from external tools.
-S <addr>:<port> 運行內建的web服務器.
-t <docroot>     指定用於內建web服務器的文檔根目錄<docroot>
-s               輸出HTML語法高亮的源碼
-v               輸出PHP的版本號
-w               輸出去掉註釋和空格的源碼
-z <file>        載入Zend擴展文件 <file>.

args...          傳遞給要運行的腳本的參數. 當第一個參數以`-`開始或者是腳本是從標準輸入讀取的時候,使用`--`參數

--ini            顯示PHP的配置文件名

--rf <name>      顯示關於函數 <name> 的信息.
--rc <name>      顯示關於類 <name> 的信息.
--re <name>      顯示關於擴展 <name> 的信息.
--rz <name>      顯示關於Zend擴展 <name> 的信息.
--ri <name>      顯示擴展 <name> 的配置信息.

上面列出了PHP命令所有的參數及其註釋,接下來,我們將對其中比較常用的參數舉例說明。

###以交互式shell模式運行php

用過 Python 的朋友對Python的交互式shell比較熟悉,在命令行下,如果我們直接輸入python命令,則會進入python的交互式shell程序,接下來就可以交互式的執行一些計算任務。

python-shell

在PHP命令行中,同樣提供了類似的功能,使用-a參數即可進入交互shell模式。

php-shell

在該shell中,我們可以執行一些簡單的任務,而不需要總是新建一個php文件。

更詳細的使用說明,請參考官方文檔

###運行內建的Web服務器

PHP 5.4.0開始,PHP的命令行模式提供了一個內建的web服務器。使用-S開始運行web服務。

假設當前我們處在目錄/Users/mylxsw/codes/php/aicode/demo,在該目錄中,存在index.php文件。

$ ls
index.php
$ cat index.php
<?php
echo "Hello, PHPER!";

在該目錄中,執行以下命令可以啓動內建web服務器,並且默認以當前目錄爲工作目錄

$ php -S localhost:8000
PHP 5.6.3 Development Server started at Wed Jun 10 15:49:41 2015
Listening on http://localhost:8000
Document root is /Users/mylxsw/codes/php/aicode/demo
Press Ctrl-C to quit.

我們另外開啓一個shell窗口,請求http://localhost:8000/即可看到腳本輸出

$ curl -is http://localhost:8000/
HTTP/1.1 200 OK
Host: localhost:8000
Connection: close
X-Powered-By: PHP/5.6.3
Content-type: text/html; charset=UTF-8

Hello, PHPER!

在web服務運行的窗口,可以看到輸出的日誌信息

php-web-server-output

以上我們在啓動內建服務器的時候,只指定了-S參數讓PHP以web服務器的方式運行,這時,PHP會使用當前目錄作爲工作目錄,因此回到當前目錄下尋找請求的文件,我們還可以使用-t參數指定其它的目錄作爲工作目錄(文檔根目錄)。

更多詳細信息,請參考官方文檔

###查找PHP的配置文件

在有的時候,由於服務器上軟件安裝比較混亂,我們可能安裝了多個版本的PHP環境,這時候,如何定位我們的PHP程序使用的是那個配置文件就比較重要了。在PHP命令行參數中,提供了--ini參數,使用該參數,可以列出當前PHP的配置文件信息。

$ php --ini
Configuration File (php.ini) Path: /usr/local/etc/php/5.6
Loaded Configuration File:         /usr/local/etc/php/5.6/php.ini
Scan for additional .ini files in: /usr/local/etc/php/5.6/conf.d
Additional .ini files parsed:      (none)

$ /usr/local/php/bin/php --ini
Configuration File (php.ini) Path: /usr/local/php/etc/
Loaded Configuration File:         /usr/local/php/etc/php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed:      (none)

上述的服務器上我們安裝了兩個版本的PHP,由上可以看到,使用php --ini命令可以很方便的定位當前PHP命令將會採用哪個配置文件。

###查看類/函數/擴展信息

通常,我們可以使用php --info命令或者在在web服務器上的php程序中使用函數phpinfo()顯示php的信息,然後再查找相關類、擴展或者函數的信息,這樣做實在是麻煩了一些。

$ php --info | grep redis
redis
Registered save handlers => files user redis
This program is free software; you can redistribute it and/or modify

我們可以使用下列參數更加方便的查看這些信息

--rf <name>      顯示關於函數 <name> 的信息.
--rc <name>      顯示關於類 <name> 的信息.
--re <name>      顯示關於擴展 <name> 的信息.
--rz <name>      顯示關於Zend擴展 <name> 的信息.
--ri <name>      顯示擴展 <name> 的配置信息.

例如,我們希望查看擴展redis的配置信息

$ php --ri redis

redis

Redis Support => enabled
Redis Version => 2.2.7

查看redis類的信息

$ php --rc redis
Class [ <internal:redis> class Redis ] {

  - Constants [19] {
    Constant [ integer REDIS_NOT_FOUND ] { 0 }
    ...
  - Methods [201] {
    ...
    Method [ <internal:redis> public method echo ] {
    }
	...

查看函數printf的信息

$ php --rf printf
Function [ <internal:standard> function printf ] {

  - Parameters [2] {
    Parameter #0 [ <required> $format ]
    Parameter #1 [ <optional> ...$args ]
  }
}

###語法檢查

有時候,我們只需要檢查php腳本是否存在語法錯誤,而不需要執行它,比如在一些編輯器或者IDE中檢查PHP文件是否存在語法錯誤。

使用-l--syntax-check)可以只對PHP文件進行語法檢查。

$ php -l index.php
No syntax errors detected in index.php

假如此時我們的index.php中存在語法錯誤

$ php -l index.php
PHP Parse error:  syntax error, unexpected 'echo' (T_ECHO) in index.php on line 3

Parse error: syntax error, unexpected 'echo' (T_ECHO) in index.php on line 3
Errors parsing index.php

##命令行腳本開發

在使用PHP開發命令行腳本的時候,與開發web程序是明顯不同的,在web程序中,我們可以通過改變url的參數,爲PHP環境提供不同的輸入,但是在命令行腳本程序中如何獲取外部的輸入呢?

在使用C語言開發程序時,我們通常會在main函數中提供兩個可選的參數int main(int argc, char *argv[]),這兩個參數就是從命令行提供的輸入參數。在PHP中,提供了兩個全局變量$argc$argv用於獲取命令行輸入。

  • $argc 包含了 $argv數組包含元素的數目
  • $argv 是一個數組,包含了提供的參數,第一個參數總是腳本文件名稱

假設我們有一個名爲console.php的命令行腳本文件

<?php
echo '命令行參數個數: ' . $argc . "\n";
echo "命令行參數:\n";
foreach ($argv as $index => $arg) {
    echo "    {$index} : {$arg}\n";
}

在命令行下執行該腳本

$ php console.php hello world
命令行參數個數: 3
命令行參數:
    0 : console.php
    1 : hello
    2 : world

可以看到,第0個參數是我們執行的腳本名稱。需要注意的是,如果提供的第一個參數是以-開頭的話,需要在前面增加--,以告訴php這後面的參數是提供給我們的腳本的,而不是php執行文件的(php -r 'var_dump($argv);' -- -h)。

另外,在腳本中,我們可以通過php_sapi_name()函數判斷是否是在命令行下運行的

$ php -r 'echo php_sapi_name(), PHP_EOL;'
cli

參考文獻

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章