Common Application of the CLI
What is PHP-CLI
PHP-CLI is php Command Line Interface
the abbreviation, that is, the PHP command line interface, under Windows and Linux are supported PHP-CLI mode;
Why to use PHP-CLI
- Multithreaded applications
- Execute PHP programs regularly
- Develop desktop programs (use PHP-CLI and GTK packages to develop desktops, but no one will use PHP to write desktop programs)
- Writing a shell script for PHP
Determine PHP operating mode
PHP runs much more than Apache and CLI, including: 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.
Php-cli built-in parameters
d:\wamp\bin\php\php5.3.8>php-helpusage:php [Options] [-f]
[--] [args ...] PHP [Options]-R
[--] [args ...] PHP [Options] [-B ]-R [-E ] [--] [args ...] php [options] [-B ]-F [-E ] [--] [args ...] php [options]--[args ...] php [options]-a-a Run interactively-c | Look for php.ini file in this directory-n No php.ini file'll be used-d Foo[=bar] Define INI entry foo with value ' Bar ' -e Generate extended information for debugger/profiler-f Parse and Execute . -H This help-i PHP information-l Syntax Check Only (lint)-M Show compiled in Modules-r Run PHPWithout using script tags -B Run PHP Before processing input lines-r Run PHPFor every input line-f Parse and Execute For every input line-e Run PHP 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 Load Zend extension . args ... Arguments passed to script. Use – args When first argument starts With-or script was read from stdin--ini Show configuration file names--rf name> Show information about function .--RC Show information about class .--re Show information about extension .--ri Show configuration for extension .
# php /var/www/html/test.phpthis is a php-cli [root@semple html]# php -f 'test.php'this is a php-cli
D:\wamp\bin\php\php5.3.8>php -r "echo 'hello world';"hello world
注意: 在运行这些php代码时没有开始和结束的标记符!加上 -r
参数后,这些标记符是不需要的,加上它们会导致语法错误。
通过标准输入(stdin)提供需要运行的 PHP 代码
// ask for inputfwrite(STDOUT, "Enter your name: ");// get input$name = trim(fgets(STDIN));// write input backfwrite(STDOUT, "Hello, $name!");
D:\wamp\www>php test.phpEnter your name:D:\wamp\www>php test.phpEnter your name: zhouzhouHello, zhouzhou!
获取自定义参数
print_r($argv); //获取具体的参数;print_r($argc); //获取参数的数目;
D:\wamp\www>php test.php #本身执行的php文件就作为一个参数;Array( [0] => test.php)1D:\wamp\www>php test.php arg1 arg2 arg3 arg4Array( [0] => test.php [1] => arg1 [2] => arg2 [3] => arg3 [4] => arg4)5
argv
和argc
也分别可以在$_SERVER数组中得到
D:\wamp\www>php test.php -g group -m module -a ageArray( [g] => group [m] => module [a] => age)
PHP-CLI在框架中的应用
首先要清楚,大多数PHP-CLI都是在crontab中应用,俗称'跑脚本'。既然是'跑',那肯定是一个庞大的IO开销,这个时候放在框架环境中来跑这个脚本的话,至少我的使用过程中遇见过'内存泄漏',php这种语言基本上不会遇见的情况就是在这种情况下遇见的;
# php /var/www/html/web2/index.php welcome test 这个是在ci里面执行的welcome控制器里面的test方法,后面的以此类推;
还可以代入变量
$ 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 "";print_r($fileList); //把所有ls -l的结果都给了$fileList;echo "";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篇】,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。