PHP命令行下的世界

PHP作为一门web开发语言,通常情况下我们都是在Web Server中运行PHP,使用浏览器访问,因此很少关注其命令行操作以及相关参数的使用,但是,特别是在类Unix操作系统上,PHP可以作为一门脚本语言执行与shell类似的处理任务。

##php命令行(CLI)参数详解

查看PHP的所有命令行参数,使用php -h命令。我们将会对大部分常用的命令行参数进行一一解释,以加深对PHP能力的认识,更加快捷的在服务端命令行下使用PHP或者调试各种因为对环境不熟悉而出现的问题。

1-a 以交互式shell模式运行 2-c <path>|<file> 指定php.ini文件所在的目录 3-n 指定不使用php.ini文件 4-d foo[=bar] 定义一个INI实体,key为foo,value为'bar' 5-e 为调试和分析生成扩展信息 6-f <file> 解释和执行文件<file>. 7-h 打印帮助 8-i 显示PHP的基本信息 9-l 进行语法检查 (lint) 10-m 显示编译到内核的模块 11-r <code> 运行PHP代码<code>,不需要使用标签 <?..?> 12-B <begin_code> 在处理输入之前先执行PHP代码<begin_code> 13-R <code> 对输入的没一行作为PHP代码<code>运行 14-F <file> Parse and execute <file> for every input line 15-E <end_code> Run PHP <end_code> after processing all input lines 16-H Hide any passed arguments from external tools. 17-S <addr>:<port> 运行内建的web服务器. 18-t <docroot> 指定用于内建web服务器的文档根目录<docroot> 19-s 输出HTML语法高亮的源码 20-v 输出PHP的版本号 21-w 输出去掉注释和空格的源码 22-z <file> 载入Zend扩展文件 <file>. 23 24args... 传递给要运行的脚本的参数. 当第一个参数以`-`开始或者是脚本是从标准输入读取的时候,使用`--`参数 25 26--ini 显示PHP的配置文件名 27 28--rf <name> 显示关于函数 <name> 的信息. 29--rc <name> 显示关于类 <name> 的信息. 30--re <name> 显示关于扩展 <name> 的信息. 31--rz <name> 显示关于Zend扩展 <name> 的信息. 32--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文件。

1$ ls 2index.php 3$ cat index.php 4<?php 5echo "Hello, PHPER!";

在该目录中,执行以下命令可以启动内建web服务器,并且默认以当前目录为工作目录

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

我们另外开启一个shell窗口,请求http://localhost:8000/即可看到脚本输出

1$ curl -is http://localhost:8000/ 2HTTP/1.1 200 OK 3Host: localhost:8000 4Connection: close 5X-Powered-By: PHP/5.6.3 6Content-type: text/html; charset=UTF-8 7 8Hello, PHPER!

在web服务运行的窗口,可以看到输出的日志信息

php-web-server-output

以上我们在启动内建服务器的时候,只指定了-S参数让PHP以web服务器的方式运行,这时,PHP会使用当前目录作为工作目录,因此回到当前目录下寻找请求的文件,我们还可以使用-t参数指定其它的目录作为工作目录(文档根目录)。

更多详细信息,请参考官方文档

###查找PHP的配置文件

在有的时候,由于服务器上软件安装比较混乱,我们可能安装了多个版本的PHP环境,这时候,如何定位我们的PHP程序使用的是那个配置文件就比较重要了。在PHP命令行参数中,提供了--ini参数,使用该参数,可以列出当前PHP的配置文件信息。

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

上述的服务器上我们安装了两个版本的PHP,由上可以看到,使用php --ini命令可以很方便的定位当前PHP命令将会采用哪个配置文件。

###查看类/函数/扩展信息

通常,我们可以使用php --info命令或者在在web服务器上的php程序中使用函数phpinfo()显示php的信息,然后再查找相关类、扩展或者函数的信息,这样做实在是麻烦了一些。

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

我们可以使用下列参数更加方便的查看这些信息

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

例如,我们希望查看扩展redis的配置信息

1$ php --ri redis 2 3redis 4 5Redis Support => enabled 6Redis Version => 2.2.7

查看redis类的信息

1$ php --rc redis 2Class [ <internal:redis> class Redis ] { 3 4 - Constants [19] { 5 Constant [ integer REDIS_NOT_FOUND ] { 0 } 6 ... 7 - Methods [201] { 8 ... 9 Method [ <internal:redis> public method echo ] { 10 } 11 ...

查看函数printf的信息

1$ php --rf printf 2Function [ <internal:standard> function printf ] { 3 4 - Parameters [2] { 5 Parameter #0 [ <required> $format ] 6 Parameter #1 [ <optional> ...$args ] 7 } 8}

###语法检查

有时候,我们只需要检查php脚本是否存在语法错误,而不需要执行它,比如在一些编辑器或者IDE中检查PHP文件是否存在语法错误。

使用-l--syntax-check)可以只对PHP文件进行语法检查。

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

假如此时我们的index.php中存在语法错误

1$ php -l index.php 2PHP Parse error: syntax error, unexpected 'echo' (T_ECHO) in index.php on line 3 3 4Parse error: syntax error, unexpected 'echo' (T_ECHO) in index.php on line 3 5Errors parsing index.php

##命令行脚本开发

在使用PHP开发命令行脚本的时候,与开发web程序是明显不同的,在web程序中,我们可以通过改变url的参数,为PHP环境提供不同的输入,但是在命令行脚本程序中如何获取外部的输入呢?

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

  • $argc 包含了 $argv数组包含元素的数目
  • $argv 是一个数组,包含了提供的参数,第一个参数总是脚本文件名称

假设我们有一个名为console.php的命令行脚本文件

1<?php 2echo '命令行参数个数: ' . $argc . "\n"; 3echo "命令行参数:\n"; 4foreach ($argv as $index => $arg) { 5 echo " {$index} : {$arg}\n"; 6}

在命令行下执行该脚本

1$ php console.php hello world 2命令行参数个数: 3 3命令行参数: 4 0 : console.php 5 1 : hello 6 2 : world

可以看到,第0个参数是我们执行的脚本名称。需要注意的是,如果提供的第一个参数是以-开头的话,需要在前面增加-- ,以告诉php这后面的参数是提供给我们的脚本的,而不是php执行文件的(php -r 'var_dump($argv);' -- -h)。

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

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

参考文献

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

PHP命令行下的世界 - HelloWorld