PHP 之命令行模式

1. 所有可用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
which php
/usr/bin/php
➜ php -h
Usage: php [options] [-f] <file> [--] [args...]
php [options] -r <code> [--] [args...]
php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...]
php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...]
php [options] -S <addr>:<port> [-t docroot]
php [options] -- [args...]
php [options] -a

-a 以交互式shell模式运行
-c <path>|<file> 在此目录中查找php.ini文件
-n 指定不使用php.ini文件
-d foo[=bar] 定义一个INI实体,key为foo,value为'bar'
-e 为调试和分析生成扩展信息
-f <file> 解释和执行文件
-h 打印当前帮助信息
-i 显示PHP的基本信息
-l 进行语法检查 (lint)
-m 显示编译到内核的模块
-r <code> 运行PHP代码,不需要使用标签 <?..?>
-B <begin_code> 在处理输入之前先执行PHP代码
-R <code> 对输入的每一行作为PHP代码运行
-F <file> 解释执行文件 <file> 中的代码
-E <end_code> 在处理输入之后执行PHP代码
-H 从外部工具隐藏传递过的参数
-S <addr>:<port> 运行内建的web服务器
-t <docroot> 指定用于内建web服务器的文档根目录
-s 输出HTML语法高亮的源码
-v 输出PHP的版本号
-w 输出去掉注释和空格的源码
-z <file> 载入Zend扩展文件

args... 传递给要运行的脚本的参数。当第一个参数以-开始或者是脚本是从标准输入读取的时候,使用--参数

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

--rf <name> 显示关于函数 <name> 的信息
--rc <name> 显示关于类 <name> 的信息
--re <name> 显示关于扩展 <name> 的信息
--rz <name> 显示关于Zend扩展 <name> 的信息
--ri <name> 显示扩展 <name> 的配置信息

2. 常用操作

2.1. 以交互模式运行 PHP

类似 Python,进入交互模式后,可用直接执行 PHP 代码,而不需要先创建 .php 文件

1
2
3
4
5
6
➜ php -a
Interactive shell

php > echo 'hello world';
hello world
php > exit

2.2. 运行内建的 Web 服务器

PHP 5.4.0 开始,PHP 的命令行模式提供了一个内建的 Web 服务器。

1
2
3
4
5
6
7
8
9
pwd
/Users/user1/test
touch index.php
echo "<?php phpinfo();" > index.php
➜ php -S localhost:8000
PHP 5.6.30 Development Server started at Tue Sep 5 10:53:51 2017
Listening on http://localhost:8000
Document root is /Users/user1/test
Press Ctrl-C to quit.

此时,我们在浏览器中输入地址 localhost:8000 即可打开 index.php ,并输出 phpinfo() 的内容,请求访问日志如下:

1
2
3
[Tue Sep  5 10:53:53 2017] PHP Warning:  phpinfo(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in /Users/user1/test/index.php on line 1
[Tue Sep 5 10:53:53 2017] ::1:53689 [200]: /
[Tue Sep 5 10:53:53 2017] ::1:53690 [404]: /favicon.ico - No such file or directory

使用 ctrl + c 关闭服务

2.3. 查找 php.ini 文件

1
2
3
4
5
6
7
8
9
10
11
12
➜ php --ini
Configuration File (php.ini) Path: /etc
Loaded Configuration File: /etc/php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed: (none)
which php
/usr/bin/php
➜ /usr/bin/php --ini
Configuration File (php.ini) Path: /etc
Loaded Configuration File: /etc/php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed: (none)

2.4. 语法检查

1
2
3
4
5
6
7
echo "<?php echo 'hello world' " > index.php
➜ php -l index.php
PHP Parse error: parse error, expecting `','' or `';'' in index.php on line 2
Errors parsing index.php
echo "<?php echo 'hello world'; " > index.php
➜ php -l index.php
No syntax errors detected in index.php

2.5. 命令行脚本开发

在使用 C 语言开发程序时,我们通常会在 main 函数中提供两个可选的参数 int main(int argc, char *argv[]),这两个参数就是从命令行提供的输入参数。

在PHP中,提供了两个全局变量 $argc$argv 用于获取命令行输入。

  • $argc 包含了 $argv 数组包含元素的数目
  • $argv 是一个数组,包含了提供的参数,第一个参数总是脚本文件名称
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
➜ vim console.php

<?php
echo '命令行参数个数:' . $argc . "\n";
echo "命令行参数:\n";
foreach ($argv as $key => $arg) {
echo "\t" . $key . ' : ' . $arg . "\n";
}

➜ php console.php hello world
命令行参数个数:3
命令行参数:
0 : console.php
1 : hello
2 : world

在脚本中,可以通过 php_sapi_name() 函数判断是否是在命令行下运行的

1
2
➜ php -r 'echo php_sapi_name(), PHP_EOL;'
cli