php cli模式學(xué)習(xí)(PHP命令行模式)
php_cli模式簡(jiǎn)介
php-cli是php Command Line Interface的簡(jiǎn)稱,如同它名字的意思,就是php在命令行運(yùn)行的接口,區(qū)別于在Web服務(wù)器上運(yùn)行的php環(huán)境(php-cgi, isapi等) 也就是說,php不單可以寫前臺(tái)網(wǎng)頁,它還可以用來寫后臺(tái)的程序。 PHP的CLI shell腳本適用于所有的PHP優(yōu)勢(shì),使創(chuàng)建要么支持腳本或系統(tǒng)甚至與GUI應(yīng)用程序的服務(wù)端!——注:windows和linux下都支持php_cli模式
PHP-cli應(yīng)用場(chǎng)景:
1.多線程應(yīng)用
這方面的好處,引用鳥哥的話:
優(yōu)點(diǎn):
1. 使用多進(jìn)程, 子進(jìn)程結(jié)束以后, 內(nèi)核會(huì)負(fù)責(zé)回收資源
2. 使用多進(jìn)程,子進(jìn)程異常退出不會(huì)導(dǎo)致整個(gè)進(jìn)程Thread退出. 父進(jìn)程還有機(jī)會(huì)重建流程.
3. 一個(gè)常駐主進(jìn)程, 只負(fù)責(zé)任務(wù)分發(fā), 邏輯更清楚.
php的多線程—沒錯(cuò)就是php多線程應(yīng)用,雖然大家都普遍認(rèn)為php沒有多線程(curl屬于模擬多線程而不是真實(shí)的),但是在php_cli模式下的php徹底的是屬于多線程。這個(gè)時(shí)候php屬于linux的一個(gè)守護(hù)進(jìn)程。 在本人之前寫過的《PHP多線程批量采集下載美女圖片(續(xù))》的時(shí)候在采集程序里雖然使用curl來模擬多線程,但是在瀏覽器執(zhí)行的時(shí)候也是會(huì)遇到執(zhí)行超時(shí)或內(nèi)存abort而導(dǎo)致程序中斷,(要嘗試幾次才可以徹底成功),但是如果在php-cli模式下執(zhí)行,你就會(huì)發(fā)現(xiàn)這個(gè)程序執(zhí)行的很快,php多線程執(zhí)行的優(yōu)勢(shì)被徹底表現(xiàn)出來了.
備注:這種多線程方式不是很成熟,不適合大規(guī)模的生成應(yīng)用,偶爾使用還是可以的
2.定時(shí)執(zhí)行php程序
之前本人總結(jié)關(guān)于《PHP定時(shí)執(zhí)行計(jì)劃任務(wù)》的三種方式,利用有一張就是利用linux的cron方式,那么這個(gè)方式是如何定時(shí)執(zhí)行php程序?請(qǐng)看下文
3.開發(fā)桌面程序
你可以做您的Windows或Linux中使用PHP的圖形用戶界面(GUI)應(yīng)用!所有你需要的是PHP的命令行接口和一包GTK。這將允許建立真正的便攜式圖形用戶界面應(yīng)用程序(呵呵,之前只是知道php可以做桌面程序,現(xiàn)在才知道是使用php_cli模式),并且不需要學(xué)習(xí)別的。
4.編寫PHP的shell腳本
如果你不會(huì)bash shell或者Perl等的使用,但是你又需要一些腳本去執(zhí)行的時(shí)候,怎么辦?這個(gè)時(shí)候你完全可以使用你熟悉的php編寫shell腳本,這個(gè)時(shí)候你是不是突然感覺PHP是不是太強(qiáng)大了!—–真正做到一種語言,到處開發(fā)!
PHP_CLI使用方法
win下面的執(zhí)行方法:
假設(shè)php.exe 在D:xamppphp在dos命令在可以這個(gè)執(zhí)行:
就可以執(zhí)行test.php這個(gè)文件了 。這里推薦win平臺(tái)下xampp集成環(huán)境,真正比wamp強(qiáng)大N倍,這個(gè)集成包可以直接進(jìn)入dos模式。
linux下php_cli使用
首先找到你安裝php的路徑,以我為例:

php安裝在路徑/usr/local/php/bin/php下
就可以執(zhí)行a。php文件
PHP_CLI編程需知
如何檢測(cè)環(huán)境支持php_cli模式?
<?php
//方法1
if (PHP_SAPI === 'cli')
{
// ...
}
//方法2
if (php_sapi_name() === 'cli')
{
// ...
}
PHP_ClI如何接收參數(shù)?
默認(rèn)情況下/usr/local/php/bin/php接收參數(shù)是$argv,這個(gè)變量是固定的!在php文件中var_dump($argv);
得到下面結(jié)果:

可以寫個(gè)簡(jiǎn)單的處理函數(shù)把這個(gè)方式轉(zhuǎn)化為大家常用的GET/post的參數(shù)模式。
簡(jiǎn)單代碼:
<?php
function parseArgs($argv){
array_shift($argv);
$out = array();
foreach ($argv as $arg){
if (substr($arg,0,2) == '--'){
$eqPos = strpos($arg,'=');
if ($eqPos === false){
$key = substr($arg,2);
$out[$key] = isset($out[$key]) ? $out[$key] : true;
} else {
$key = substr($arg,2,$eqPos-2);
$out[$key] = substr($arg,$eqPos+1);
}
} else if (substr($arg,0,1) == '-'){
if (substr($arg,2,1) == '='){
$key = substr($arg,1,1);
$out[$key] = substr($arg,3);
} else {
$chars = str_split(substr($arg,1));
foreach ($chars as $char){
$key = $char;
$out[$key] = isset($out[$key]) ? $out[$key] : true;
}
}
} else {
$out[] = $arg;
}
}
return $out;
}
var_dump($argv);
var_dump(parseArgs($argv));exit;
執(zhí)行結(jié)果:

當(dāng)然實(shí)現(xiàn)的方法不止一個(gè),大家可以嘗試其他方法實(shí)現(xiàn)!
例外關(guān)于php的cli還有很多參數(shù)可以加入:具體可以參考:http://php.net/manual/en/features.commandline.php
關(guān)于定時(shí)執(zhí)行
cron是一個(gè)linux下的定時(shí)執(zhí)行工具,可以在無需人工干預(yù)的情況下運(yùn)行作業(yè),周期性作業(yè),比如備份數(shù)據(jù) 打開/etc/crontab,添加:
/usr/bin/php -f /data/htdocs/test.php
關(guān)于corntab的詳細(xì)使用參考51cto專題:Linux計(jì)劃任務(wù)——cron服務(wù)
本文參考資料
http://www.dbjr.com.cn/article/1716.htm
http://www.dbjr.com.cn/article/37804.htm
http://www.dbjr.com.cn/article/37796.htm
附注:2012-06-16 增加php_cli編程需知等
相關(guān)文章
ThinkPHP使用心得分享-上傳類UploadFile的使用
ThinkPHP中的UploadFile類用于處理文件上傳,本文小總結(jié)了一下關(guān)于學(xué)習(xí)過程中對(duì)UploadFile類的使用方法。2014-05-05PHP使用PDO、mysqli擴(kuò)展實(shí)現(xiàn)與數(shù)據(jù)庫交互操作詳解
這篇文章主要介紹了PHP使用PDO、mysqli擴(kuò)展實(shí)現(xiàn)與數(shù)據(jù)庫交互操作,結(jié)合實(shí)例形式分析了PHP基于pdo和mysqli操作數(shù)據(jù)的相關(guān)使用技巧,需要的朋友可以參考下2019-07-07PHP Post獲取不到非表單數(shù)據(jù)的問題解決辦法
這篇文章主要介紹了PHP Post獲取不到非表單數(shù)據(jù)的問題的解決辦法以及代碼分享,需要的朋友參考下。2018-02-02PHP實(shí)現(xiàn)本地圖片轉(zhuǎn)base64格式并上傳
這篇文章主要介紹了PHP實(shí)現(xiàn)本地圖片轉(zhuǎn)base64格式并上傳,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05PHP內(nèi)核介紹及擴(kuò)展開發(fā)指南—基礎(chǔ)知識(shí)
本章簡(jiǎn)要介紹一些Zend引擎的內(nèi)部機(jī)制,這些知識(shí)和Extensions密切相關(guān),同時(shí)也可以幫助我們寫出更加高效的PHP代碼。2011-09-09使用Smarty 獲取當(dāng)前日期時(shí)間和格式化日期時(shí)間的方法詳解
本篇文章是對(duì)使用Smarty獲取當(dāng)前日期時(shí)間和格式化日期時(shí)間的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06