CLI的普通应用

什么是PHP-CLI

php-cli是php Command Line Interface的简称,即PHP命令行接口,在windows和linux下都是支持PHP-CLI模式的;

为什么要使用PHP-CLI

  • 多线程应用
  • 定时执行php程序
  • 开发桌面程序 (使用PHP-CLI和GTK包即可开发桌面,但没人会用PHP来编写桌面程序的)
  • 编写PHP的shell脚本

判断PHP运行模式

PHP的运行模式远远不止apache和cli,还包括:olserver, apache, apache2filter, apache2handler, caudium, cgi (until PHP 5.3), cgi-fcgi, cli, continuity, embed, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux, and webjames.

echo php_sapi_name(); //如果是CLI模式下访问就输出CLI,如果是Apache就是apache2handler...

PHP-CLI 内置参数

D:\wamp\bin\php\php5.3.8>php -help
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] -- [args...]
php [options] -a -a Run interactively
-c <path>|<file> Look for php.ini file in this directory
-n No php.ini file will be used
-d foo[=bar] Define INI entry foo with value 'bar'
-e Generate extended information for debugger/profiler
-f <file> Parse and execute <file>.
-h This help
-i PHP information
-l Syntax check only (lint)
-m Show compiled in modules
-r <code> Run PHP <code> without using script tags <?..?>
-B <begin_code> Run PHP <begin_code> before processing input lines
-R <code> Run PHP <code> for every input line
-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 Output HTML syntax highlighted source.
-v Version number
-w Output source with stripped comments and whitespace.
-z <file> Load Zend extension <file>. args... Arguments passed to script. Use -- args when first argument
starts with - or script is read from stdin --ini Show configuration file names --rf <name> Show information about function <name>.
--rc <name> Show information about class <name>.
--re <name> Show information about extension <name>.
--ri <name> Show configuration for extension <name>.
  • 运行指定的php文件:
<?php
echo 'this is php-cli'
?>
# php /var/www/html/test.php
this is a php-cli [root@semple html]# php -f 'test.php'
this is a php-cli
  • 在命令行直接运行 PHP 代码
D:\wamp\bin\php\php5.3.8>php -r "echo 'hello world';"
hello world

注意: 在运行这些php代码时没有开始和结束的标记符!加上 -r 参数后,这些标记符是不需要的,加上它们会导致语法错误。

  • 通过标准输入(stdin)提供需要运行的 PHP 代码
// ask for input
fwrite(STDOUT, "Enter your name: "); // get input
$name = trim(fgets(STDIN)); // write input back
fwrite(STDOUT, "Hello, $name!");
D:\wamp\www>php test.php
Enter your name: D:\wamp\www>php test.php
Enter your name: zhouzhou
Hello, zhouzhou!

获取自定义参数

print_r($argv); //获取具体的参数;

print_r($argc); //获取参数的数目;
D:\wamp\www>php test.php #本身执行的php文件就作为一个参数;
Array
(
[0] => test.php
)
1 D:\wamp\www>php test.php arg1 arg2 arg3 arg4
Array
(
[0] => test.php
[1] => arg1
[2] => arg2
[3] => arg3
[4] => arg4
) 5

argvargc也分别可以在$_SERVER数组中得到

<?php
$args = getopt('g:m:a:'); //只能是单个单词,如果不是单个单词就会出错;
print_r($args);
?>
D:\wamp\www>php test.php -g group -m module -a age
Array
(
[g] => group
[m] => module
[a] => age
)

PHP-CLI在框架中的应用

首先要清楚,大多数PHP-CLI都是在crontab中应用,俗称'跑脚本'。既然是'跑',那肯定是一个庞大的IO开销,这个时候放在框架环境中来跑这个脚本的话,至少我的使用过程中遇见过'内存泄漏',php这种语言基本上不会遇见的情况就是在这种情况下遇见的;

  • 在CI框架中应用
# php /var/www/html/web2/index.php welcome test 这个是在ci里面执行的welcome控制器里面的test方法,后面的以此类推;

还可以代入变量

<?php
class Tools extends CI_Controller { public function message($to = 'World')
{
echo "Hello {$to}!".PHP_EOL;
}
}
?>
$ cd /path/to/project;
$ php index.php tools message
# Hello John Smith!。
  • 在TP框架中的应用

    在thinkphp中对CLI的支持并非很好,但我们可以通过$argv在框架运行之初就自动组成相应的g,m,a等get变量;甚至另开其一个只能是cli模式访问文件
//如果是CLI模式
if(php_sapi_name() === 'cli'){
//检测CLI访问时没有带自定义参数;
$path = isset($argv[1]) ? $argv[1] : '';
$depr = '/';
if (!empty($path)) {
$params = explode($depr , trim($path , $depr));
}
!empty($params) ? $_GET['g'] = array_shift($params) : "";
!empty($params) ? $_GET['m'] = array_shift($params) : "";
!empty($params) ? $_GET['a'] = array_shift($params) : "";
if ($params and count($params) > 1) {
// 解析剩余参数 并采用GET方式获取
preg_replace('@(\w+),([^,\/]+)@e' , '$_GET[\'\\1\']="\\2";' , implode(',' , $params));
}
/*
D:\wamp\www\sx>D:\wamp\bin\php\php5.3.8/php cli.php group/module/action/a1/v1/a2/v2
Array
(
[g] => group
[m] => module
[a] => action
[a1] => v1
[a2] => v2
)
*/ // print_r($_GET);
// die;
}

PHP-CLI来写shell脚本

PHP与Linux命令交互的几个函数

exec

string exec ( string $command [, array &$output [, int &$return_var ]] )

echo exec('mkdir -p zhouzhou/1/2/3/') ."\n"; //创建目录树

echo exec('ls -l',$fileList) ; //本句只能输出最后一条,但如果有第二个参数的话,就可以把输出的结果作为数组元素扔进去;

echo "<pre />";
print_r($fileList); //把所有ls -l的结果都给了$fileList;
echo "<pre />";
die;

shell_exec

string shell_exec ( string $cmd ) 

$fileList = shell_exec('ls -l'); //$fileList是一个string格式,就等于linux命令在终端输出的格式,保留了\s\n等换行符

system

string system ( string $command [, int &$return_var ] )

$fileList = system('ls -l') ; //本句只能输出最后一条,但如果有第二个参数的话,就可以把输出的结果作为数组元素扔进去;

passthru

void passthru ( string $command [, int &$return_var ] )

passthru('ls -l'); //直接执行并输出

popen

resource popen ( string $command , string $mode )
/*
返回一个和 fopen() 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)并且必须用 pclose() 来关闭。此指针可以用于 fgets(),fgets() 和 fwrite()。 当模式为 'r',返回的文件指针等于命里的 STDOUT,当模式为 'w',返回的文件指针等于命令的 STDIN。 如果出错返回 FALSE。
*/ $fp = popen('ls -l',"r"); //popen打一个进程通道
while (!feof($fp)) {
$out = fgets($fp, 4096);
echo $out; //输出的结果和passthru是一样的;不过要循环的取出来;
}
pclose($fp);

proc_open

resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] )

$test = "ls";
$array = array(
array("pipe","r"), //标准输入
array("pipe","w"), //标准输出内容
array("pipe","w") //标准输出错误
); $fp = proc_open($test,$array,$pipes); //打开一个进程通道
echo stream_get_contents($pipes[1]); //为什么是$pipes[1],因为1是输出内容
proc_close($fp); //类似 popen() 函数, 但是 proc_open() 提供了更加强大的控制程序执行的能力。

CURL与PHP-CLI的应用【CLI篇】的更多相关文章

  1. 如何安装 Angular CLI 并且检查 CLI 的版本

    想在系统中安装 Angular CLI ,如何进行安装并且如何检查 CLI 的版本? 可以使用命令: npm install -g @angular/cli 进行安装. 使用命令 ng version ...

  2. Vue CLI 是如何实现的 -- 终端命令行工具篇

    Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,提供了终端命令行工具.零配置脚手架.插件体系.图形化管理界面等.本文暂且只分析项目初始化部分,也就是终端命令行工具的实现. 0. 用法 ...

  3. golang开发:类库篇(三)命令行工具cli的使用

    为什么要使用命令行 觉得这个问题不应该列出来,又觉得如果初次进行WEB开发的话,可能会觉得所有的东西都可以使用API去做,会觉得命令行没有必要. 其实,一个生产的项目命令行是绕不过去的.比如运营需要导 ...

  4. 持续集成高级篇之Jenkins cli与Jenkins ssh

    系列目录 Jenkins Cli介绍 Jenkins Cli为Jenkins提供的一个cli工具,此工具功能非常强大,可以完成诸如重启jenkins,创建/删除job,查看job控制台输出,添加/删除 ...

  5. ***CI的CLI运行方式

    linux下的执行命令: 1.PHP解释器  2.CI根目录的index.php  3.控制器所在的文件夹  4. 控制器名称  5. 方法名称  (参数) 参考文献: http://codeigni ...

  6. Cordova CLI源码分析(三)——初始化

    本部分主要涉及以下三个文件 1 cli.js 2 cordova.js 3 events.js 通过前一篇package.json的分析,可以知道,当命令行执行cordova相关命令时,首先调用mai ...

  7. 迈向angularjs2系列(8):angular cli和angular2种子项目

    文章目录 1.angular cli快速搭建项目 2.angular2-seed 3.手动配置 题外话:如何更好的阅读本篇文章 一: angular cli的安装 Angular-cli(命令行界面, ...

  8. 使用 Azure CLI 在 Azure China Cloud 云平台上手动部署一套 Cloud Foundry

    这篇文章将介绍如何使用 Azure CLI 在 Azure China Cloud 云平台上手动部署一套 Cloud Foundry.本文的目的在于: 了解作为 PaaS 的 Cloud Foundr ...

  9. Apache Commons CLI命令行启动

    今天又看了下Hangout的源码,一般来说一个开源项目有好几种启动方式--比如可以从命令行启动,也可以从web端启动.今天就看看如何设计命令行启动... Apache Commons CLI Apac ...

随机推荐

  1. (转)Hessian(C#)介绍及使用说明

    什么是Hessian? Hessian是Caucho开发的一种二进制Web Service协议.支持目前所有流行的开发平台. Hessia能干什么? hessian用来实现web服务. Hessia有 ...

  2. [java学习笔记]java语言核心----面向对象之static关键字

    static关键字用处 用于修饰成员变量和成员函数 被修饰后的成员具有以下特点: 随着类的加载而加载 优先于对象存在 被所有对象所共享 可以直接被类名调用 使用注意 静态方法只能访问静态成员:非静态方 ...

  3. Xamarin 实现android gridview 多选

    参考文章:http://blog.csdn.net/zhouyuanjing/article/details/8372686 GridView初始化代码: gridViewStudent = Find ...

  4. C++中执行windows指令

    执行windows指令: BOOL ExecDosCmd(]) { SECURITY_ATTRIBUTES sa; HANDLE hRead,hWrite; sa.nLength = sizeof(S ...

  5. winform 与 html 交互 简单案例

    本文主要简单的记录winform如何与html文件中的信息如何进行交互,即在winform中加载html界面,从而可以进行相互调用. 1.新建一个winform项目,若要在winform中加载html ...

  6. Objective-C中class、Category、Block的介绍

    @class 当定义一个类,必须为编译器提供两组消息,第一组(接口部分.h):构建类的实例的一个基本蓝图.必须指定类名,类的超类,类的实例变量和类型的列表,最后是类的方法的声明.第二组(实现部分.m) ...

  7. 浏览器内核-Webkit

    关键字:浏览器内核,浏览器引擎,Browser,Webkit,Blink,Chromium. 本文简单介绍一下各种浏览器内核.着种介绍一下Webkit.顾名思义,浏览器内核就是浏览器的核心部分,也可以 ...

  8. uva401 - Palindromes结题报告

    题目地址 :  http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  9. 2016年辛星less教程发布了

    首先简介一下less吧,它是一个css预处理器.当我们的项目比较大的时候,我们的css的代码量也会急剧的膨胀,因此就有很多方案来让编程更加容易,没错,less就是这样一种技术. 在百度网盘的下载地址为 ...

  10. Kinetic使用注意点--container

    <virtual> new Container(config) 参数: config:包含所有配置项的对象. { x: "横坐标", y: "纵坐标" ...