[关闭]
@a5635268 2017-01-01T17:08:52.000000Z 字数 5086 阅读 1609

CURL与PHP-CLI的应用【CLI篇】

Linux PHP


CLI的普通应用

什么是PHP-CLI

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

为什么要使用PHP-CLI

判断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.

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

PHP-CLI 内置参数

  1. D:\wamp\bin\php\php5.3.8>php -help
  2. Usage: php [options] [-f] <file> [--] [args...]
  3. php [options] -r <code> [--] [args...]
  4. php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...]
  5. php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...]
  6. php [options] -- [args...]
  7. php [options] -a
  8. -a Run interactively
  9. -c <path>|<file> Look for php.ini file in this directory
  10. -n No php.ini file will be used
  11. -d foo[=bar] Define INI entry foo with value 'bar'
  12. -e Generate extended information for debugger/profiler
  13. -f <file> Parse and execute <file>.
  14. -h This help
  15. -i PHP information
  16. -l Syntax check only (lint)
  17. -m Show compiled in modules
  18. -r <code> Run PHP <code> without using script tags <?..?>
  19. -B <begin_code> Run PHP <begin_code> before processing input lines
  20. -R <code> Run PHP <code> for every input line
  21. -F <file> Parse and execute <file> for every input line
  22. -E <end_code> Run PHP <end_code> after processing all input lines
  23. -H Hide any passed arguments from external tools.
  24. -s Output HTML syntax highlighted source.
  25. -v Version number
  26. -w Output source with stripped comments and whitespace.
  27. -z <file> Load Zend extension <file>.
  28. args... Arguments passed to script. Use -- args when first argument
  29. starts with - or script is read from stdin
  30. --ini Show configuration file names
  31. --rf <name> Show information about function <name>.
  32. --rc <name> Show information about class <name>.
  33. --re <name> Show information about extension <name>.
  34. --ri <name> Show configuration for extension <name>.
  1. <?php
  2. echo 'this is php-cli'
  3. ?>
  1. # php /var/www/html/test.php
  2. this is a php-cli
  3. [root@semple html]# php -f 'test.php'
  4. this is a php-cli
  1. D:\wamp\bin\php\php5.3.8>php -r "echo 'hello world';"
  2. hello world

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

  1. // ask for input
  2. fwrite(STDOUT, "Enter your name: ");
  3. // get input
  4. $name = trim(fgets(STDIN));
  5. // write input back
  6. fwrite(STDOUT, "Hello, $name!");
  1. D:\wamp\www>php test.php
  2. Enter your name:
  3. D:\wamp\www>php test.php
  4. Enter your name: zhouzhou
  5. Hello, zhouzhou!

获取自定义参数

  1. print_r($argv); //获取具体的参数;
  2. print_r($argc); //获取参数的数目;
  1. D:\wamp\www>php test.php #本身执行的php文件就作为一个参数;
  2. Array
  3. (
  4. [0] => test.php
  5. )
  6. 1
  7. D:\wamp\www>php test.php arg1 arg2 arg3 arg4
  8. Array
  9. (
  10. [0] => test.php
  11. [1] => arg1
  12. [2] => arg2
  13. [3] => arg3
  14. [4] => arg4
  15. )
  16. 5

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

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

PHP-CLI在框架中的应用

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

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

还可以代入变量

  1. <?php
  2. class Tools extends CI_Controller {
  3. public function message($to = 'World')
  4. {
  5. echo "Hello {$to}!".PHP_EOL;
  6. }
  7. }
  8. ?>
  1. $ cd /path/to/project;
  2. $ php index.php tools message
  3. # Hello John Smith!。
  1. //如果是CLI模式
  2. if(php_sapi_name() === 'cli'){
  3. //检测CLI访问时没有带自定义参数;
  4. $path = isset($argv[1]) ? $argv[1] : '';
  5. $depr = '/';
  6. if (!empty($path)) {
  7. $params = explode($depr , trim($path , $depr));
  8. }
  9. !empty($params) ? $_GET['g'] = array_shift($params) : "";
  10. !empty($params) ? $_GET['m'] = array_shift($params) : "";
  11. !empty($params) ? $_GET['a'] = array_shift($params) : "";
  12. if ($params and count($params) > 1) {
  13. // 解析剩余参数 并采用GET方式获取
  14. preg_replace('@(\w+),([^,\/]+)@e' , '$_GET[\'\\1\']="\\2";' , implode(',' , $params));
  15. }
  16. /*
  17. D:\wamp\www\sx>D:\wamp\bin\php\php5.3.8/php cli.php group/module/action/a1/v1/a2/v2
  18. Array
  19. (
  20. [g] => group
  21. [m] => module
  22. [a] => action
  23. [a1] => v1
  24. [a2] => v2
  25. )
  26. */
  27. // print_r($_GET);
  28. // die;
  29. }

PHP-CLI来写shell脚本

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

exec

  1. string exec ( string $command [, array &$output [, int &$return_var ]] )
  2. echo exec('mkdir -p zhouzhou/1/2/3/') ."\n"; //创建目录树
  3. echo exec('ls -l',$fileList) ; //本句只能输出最后一条,但如果有第二个参数的话,就可以把输出的结果作为数组元素扔进去;
  4. echo "<pre />";
  5. print_r($fileList); //把所有ls -l的结果都给了$fileList;
  6. echo "<pre />";
  7. die;

shell_exec

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

system

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

passthru

  1. void passthru ( string $command [, int &$return_var ] )
  2. passthru('ls -l'); //直接执行并输出

popen

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

proc_open

  1. resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] )
  2. $test = "ls";
  3. $array = array(
  4. array("pipe","r"), //标准输入
  5. array("pipe","w"), //标准输出内容
  6. array("pipe","w") //标准输出错误
  7. );
  8. $fp = proc_open($test,$array,$pipes); //打开一个进程通道
  9. echo stream_get_contents($pipes[1]); //为什么是$pipes[1],因为1是输出内容
  10. proc_close($fp);
  11. //类似 popen() 函数, 但是 proc_open() 提供了更加强大的控制程序执行的能力。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注