php cli 编程,php-cli下编程如何分层架构、面向对象、统一入口文件?
以往寫(xiě)cli下運(yùn)行的業(yè)務(wù)或者測(cè)試代碼,總是新建文件,面向過(guò)程編寫(xiě)代碼。幾次之后,cli目錄下好多文件,即便勉強(qiáng)在一個(gè)cli測(cè)試文件中寫(xiě)了一個(gè)類,也是讓其中的一個(gè)方法自啟動(dòng),要測(cè)試別的方法,總是要修改代碼,很是繁瑣。昨天接觸了phalcon的cli, 猶如醍醐灌頂, 特此發(fā)文分享。
首先,溫故而知新:
在瀏覽器中訪問(wèn)php:
http(s)://test.php.local/index.php?m=front&c=order&a=getList&p=2&cate=1調(diào)試期間,每次都敲m、c、a,太繁瑣了,url簡(jiǎn)化一下:
http(s)://test.php.local/index.php/front/order/getList?p=2&cate=1然后,index.php會(huì)做的事情必定包括:
加載配置文件加載Autoload.php, 各種function.phpDispatcher::run();初始化Db類(此時(shí)并沒(méi)有連接mysql)分析url, 得到front/order/getList, 之后,$obj = new /app/front/controller/Order();$obj->getList(); //別擔(dān)心Autoload類幫我們自動(dòng)加載類文件....在cli中,我們這樣訪問(wèn)php:(先用cd進(jìn)入項(xiàng)目根目錄)
php public/cli.php--m cli --c order --a updateMarketPrice --param value文件名之后,就是“--參數(shù) 值 --參數(shù) 值 ” 這么有規(guī)律,可以直接用getopt()獲取m、c、a參數(shù):
$arr = [ 'm:', 'a:', 'c:' ];$mca = getopt( '', $arr );注意,如果企圖簡(jiǎn)化為:
php public/cli.php/cli/order/updateMarketPrice --param value那么在linux中,public/cli.php/cli/order/updateMarketPrice會(huì)被認(rèn)為是一個(gè)文件,因?yàn)椴淮嬖?#xff0c;導(dǎo)致打開(kāi)失敗
據(jù)本猿所知,有2種簡(jiǎn)化方式:
php public/cli.php cli/order/updateMarketPrice --param value或者php public/cli.php cli order updateMarketPrice --param value文件名之后,不是以--開(kāi)頭, getopt()不認(rèn)識(shí),就罷工了,還好有php自帶的全局變量$argv,它是一個(gè)數(shù)組(以第2種方式為例):
之后,便是分析$argv這個(gè)數(shù)組,取得m、c(此處實(shí)際應(yīng)該叫t, task)、a, 組合數(shù)組$paramsArr, 以便給業(yè)務(wù)方法用。
cli.php必然也做以下事情:
加載配置文件加載Autoload.php, 各種function.phpCliDispatcher::run();初始化Db類(此時(shí)并沒(méi)有連接mysql)分析url, 得到front/order/getList, 之后,$obj = new /app/cli/task/Order(); $obj->updateMarketPrice($paramsArr); //別擔(dān)心, Autoload類幫我們自動(dòng)加載類文件....注意:
另起CliDispatcher類。 Dispatcher類已經(jīng)通過(guò)了重重考驗(yàn),不要再動(dòng)它了,再說(shuō),這也不符合面向?qū)ο蟮脑瓌t之一:對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉
使用Task而不是controller, 是為了避免這樣的情況:控制器中業(yè)務(wù)需要調(diào)用cli模塊中的方法發(fā)送微信模板消息什么的,代碼寫(xiě)著寫(xiě)著,走神了,直接new /app/cli/task/Order();
由于AutoLoad類認(rèn)定控制器一定在controller目錄在,而cli模塊卻是放在task目錄下,導(dǎo)致加載失敗,拋出錯(cuò)誤, 同時(shí)輸出建議,就像一盆涼水一樣立即“澆醒”開(kāi)發(fā)者,想想,要是cli模塊是放在controller目錄下, 還被順利執(zhí)行...
和cgi下不同,沒(méi)有$_GET, 沒(méi)有$_POST, 而且$_SERVER中關(guān)于url的各種信息也是沒(méi)有的,記得給予參數(shù),不然,取參(“餐”)無(wú)門(mén)..
$obj->updateMarketPrice($paramsArr);
cli模塊的各種logic類, 記得判斷是否php是否在cli下運(yùn)行,以免被其他cig下運(yùn)行的模塊直接調(diào)用各位小伙伴,請(qǐng)?jiān)谠u(píng)論中留下你的見(jiàn)解。
舉報(bào)/反饋
總結(jié)
以上是生活随笔為你收集整理的php cli 编程,php-cli下编程如何分层架构、面向对象、统一入口文件?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: centos mysql 5.5.57_
- 下一篇: java不大于6位_末尾带4的完全平方数