CURL與PHP-CLI的應用【CLI篇】

CLI的普通應用

什麼是PHP-CLI

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

爲何要使用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.html

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 參數後,這些標記符是不須要的,加上它們會致使語法錯誤。linux

  • 經過標準輸入(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數組中獲得web

<?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這種語言基本上不會碰見的狀況就是在這種狀況下碰見的;thinkphp

  • 在CI框架中應用
# php /var/www/html/web2/index.php welcome test 這個是在ci裏面執行的welcome控制器裏面的test方法,後面的以此類推;

還能夠代入變量shell

<?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命令交互的幾個函數

execapache

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_execwindows

string shell_exec ( string $cmd ) 

$fileList = shell_exec('ls -l'); //$fileList是一個string格式,就等於linux命令在終端輸出的格式,保留了\s\n等換行符

systemapi

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() 提供了更增強大的控制程序執行的能力。
相關文章
相關標籤/搜索