php-cli模式學習(PHP命令列模式)

來源:互聯網
上載者:User
php-cli模式學習(PHP命令列模式)

之前知道php?cli模式是一種類似shell命令式的執行php程式,不過一直以為這個是一種落後的方式,應該沒有什麼意義,因為從沒有遇到過使用這個cli模式編程的。不過今天遇到了使用cli模式的應用。
php_cli模式簡介

php-cli是php Command Line Interface的簡稱,如同它名字的意思,就是php在命令列啟動並執行介面,區別於在Web伺服器上啟動並執行php環境(php-cgi, isapi等) 也就是說,php不單可以寫前台網頁,它還可以用來寫背景程式。 PHP的CLI shell指令碼適用於所有的PHP優勢,使建立要麼支援指令碼或系統甚至與GUI應用程式的服務端!??註:windows和linux下都支援php_cli模式
PHP-cli應用情境:
1.多線程應用

這方面的好處,引用鳥哥的話:

優點: 1. 使用多進程, 子進程結束以後, 核心會負責回收資源

2. 使用多進程,子進程異常退出不會導致整個進程Thread退出. 父進程還有機會重建流程.

3. 一個常駐主進程, 只負責任務分發, 邏輯更清楚.

php的多線程?沒錯就是php多線程應用,雖然大家都普遍認為php沒有多線程(curl屬於類比多線程而不是真實的),但是在php_cli模式下的php徹底的是屬於多線程。這個時候php屬於linux的一個守護進程。 在本人之前寫過的《PHP多線程批量採集下載美女圖片(續)》的時候在採集程式裡雖然使用curl來類比多線程,但是在瀏覽器執行的時候也是會遇到執行逾時或記憶體abort而導致程式中斷,(要嘗試幾次才可以徹底成功),但是如果在php-cli模式下執行,你就會發現這個程式執行的很快,php多線程執行的優勢被徹底表現出來了.

備忘:這種多線程方式不是很成熟,不適合大規模的產生應用,偶爾使用還是可以的
2.定時執行php程式

之前本人總結關於《PHP定時執行計畫任務》的三種方式,利用有一張就是利用linux的cron方式,那麼這個方式是如何定時執行php程式?請看下文
3.開發傳統型程式

你可以做您的Windows或Linux中使用PHP的圖形化使用者介面(GUI)應用!所有你需要的是PHP的命令列介面和一包GTK。這將允許建立真正的攜帶型圖形化使用者介面應用程式(呵呵,之前只是知道php可以做傳統型程式,現在才知道是使用php_cli模式),並且不需要學習別的。
4.編寫PHP的shell指令碼

如果你不會bash shell或者Perl等的使用,但是你又需要一些指令碼去執行的時候,怎麼辦?這個時候你完全可以使用你熟悉的php編寫shell指令碼,這個時候你是不是突然感覺PHP是不是太強大了!??真正做到一種語言,到處開發!
PHP_CLI使用方法
win下面的執行方法:

假設php.exe 在D:\xampp\php在dos命令在可以這個執行:
1 D:\xampp\php\php.exe D:\xampp\htdocs\test.php

就可以執行test.php這個檔案了 。這裡推薦win平台下xamppIntegration Environment,真正比wamp強大N倍,這個整合套件可以直接進入dos模式。
linux下php_cli使用

首先找到你安裝php的路徑,以我為例:

image

php安裝在路徑/usr/local/php/bin/php下
1 /usr/local/php/bin/php /usr/local/apache/htdocs/a.php

就可以執行a。php檔案
PHP_CLI編程需知
如何檢測環境支援php_cli模式?
1 2 //方法1
3 if (PHP_SAPI === 'cli')
4 {
5 // ...
6 }
7 //方法2
8 if (php_sapi_name() === 'cli')
9 {
10 // ...
11 }

PHP_ClI如何接收參數?

預設情況下/usr/local/php/bin/php接收參數是$argv,這個變數是固定的!在php檔案中var_dump($argv);

得到下面結果:

image

可以寫個簡單的處理函數把這個方式轉化為大家常用的GET/post的參數模式。

簡單代碼:
1 2
3 function parseArgs($argv){
4 array_shift($argv);
5 $out = array();
6 foreach ($argv as $arg){
7 if (substr($arg,0,2) == '--'){
8 $eqPos = strpos($arg,'=');
9 if ($eqPos === false){
10 $key = substr($arg,2);
11 $out[$key] = isset($out[$key]) ? $out[$key] : true;
12 } else {
13 $key = substr($arg,2,$eqPos-2);
14 $out[$key] = substr($arg,$eqPos+1);
15 }
16 } else if (substr($arg,0,1) == '-'){
17 if (substr($arg,2,1) == '='){
18 $key = substr($arg,1,1);
19 $out[$key] = substr($arg,3);
20 } else {
21 $chars = str_split(substr($arg,1));
22 foreach ($chars as $char){
23 $key = $char;
24 $out[$key] = isset($out[$key]) ? $out[$key] : true;
25 }
26 }
27 } else {
28 $out[] = $arg;
29 }
30 }
31 return $out;
32 }
33 var_dump($argv);
34 var_dump(parseArgs($argv));exit;

執行結果:

image

當然實現的方法不止一個,大家可以嘗試其他方法實現!

例外關於php的cli還有很多參數可以加入:具體可以參考:http://php.net/manual/en/features.commandline.php
關於定時執行

cron是一個linux下的定時執行工具,可以在無需人工幹預的情況下運行作業,周期性作業,比如備份資料 開啟/etc/crontab,添加:

/usr/bin/php -f /data/htdocs/test.php

關於corntab的詳細使用參考51cto專題:Linux計劃任務??cron服務
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.