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

來源:互聯網
上載者:User

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 -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 will 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 PHP  without using script tags  -B  Run PHP  before processing input lines -R  Run PHP  for 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 is read from stdin --ini Show configuration file names --rf  Show information about function . --rc  Show information about class . --re  Show information about extension . --ri  Show configuration for extension .
  • 運行指定的php檔案:
# php /var/www/html/test.phpthis 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 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

argvargc也分別可以在$_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這種語言基本上不會遇見的情況就是在這種情況下遇見的;

  • 在CI架構中應用
# 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教程有興趣的朋友有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.