php cli 编程,php-cli下编程如何分层架构、面向对象、统一入口文件?

以往写cli下运行的业务或者测试代码,总是新建文件,面向过程编写代码。几次之后,cli目录下好多文件,即便勉强在一个cli测试文件中写了一个类,也是让其中的一个方法自启动,要测试别的方法,总是要修改代码,很是繁琐。昨天接触了phalcon的cli, 犹如醍醐灌顶, 特此发文分享。

首先,温故而知新:

在浏览器中访问php:

http(s)://test.php.local/index.php?m=front&c=order&a=getList&p=2&cate=1调试期间,每次都敲m、c、a,太繁琐了,url简化一下:

http(s)://test.php.local/index.php/front/order/getList?p=2&cate=1然后,index.php会做的事情必定包括:

加载配置文件加载Autoload.php, 各种function.phpDispatcher::run();初始化Db类(此时并没有连接mysql)分析url, 得到front/order/getList, 之后,$obj = new /app/front/controller/Order();$obj->getList(); //别担心Autoload类帮我们自动加载类文件....在cli中,我们这样访问php:(先用cd进入项目根目录)

php public/cli.php--m cli --c order --a updateMarketPrice --param value文件名之后,就是“--参数 值 --参数 值 ” 这么有规律,可以直接用getopt()获取m、c、a参数:

$arr = [ 'm:', 'a:', 'c:' ];$mca = getopt( '', $arr );注意,如果企图简化为:

php public/cli.php/cli/order/updateMarketPrice --param value那么在linux中,public/cli.php/cli/order/updateMarketPrice会被认为是一个文件,因为不存在,导致打开失败

据本猿所知,有2种简化方式:

php public/cli.php cli/order/updateMarketPrice --param value或者php public/cli.php cli order updateMarketPrice --param value文件名之后,不是以--开头, getopt()不认识,就罢工了,还好有php自带的全局变量$argv,它是一个数组(以第2种方式为例):

8dac9dfe2ceccbba86a76756d3d31ab4.png

之后,便是分析$argv这个数组,取得m、c(此处实际应该叫t, task)、a, 组合数组$paramsArr, 以便给业务方法用。

cli.php必然也做以下事情:

加载配置文件加载Autoload.php, 各种function.phpCliDispatcher::run();初始化Db类(此时并没有连接mysql)分析url, 得到front/order/getList, 之后,$obj = new /app/cli/task/Order(); $obj->updateMarketPrice($paramsArr); //别担心, Autoload类帮我们自动加载类文件....注意:

另起CliDispatcher类。 Dispatcher类已经通过了重重考验,不要再动它了,再说,这也不符合面向对象的原则之一:对扩展开放,对修改关闭

3bb5d8a4e39d5f45bdf89e3485c7d759.png

使用Task而不是controller, 是为了避免这样的情况:控制器中业务需要调用cli模块中的方法发送微信模板消息什么的,代码写着写着,走神了,直接new /app/cli/task/Order();

由于AutoLoad类认定控制器一定在controller目录在,而cli模块却是放在task目录下,导致加载失败,抛出错误, 同时输出建议,就像一盆凉水一样立即“浇醒”开发者,想想,要是cli模块是放在controller目录下, 还被顺利执行...

和cgi下不同,没有$_GET, 没有$_POST, 而且$_SERVER中关于url的各种信息也是没有的,记得给予参数,不然,取参(“餐”)无门..

$obj->updateMarketPrice($paramsArr);

cli模块的各种logic类, 记得判断是否php是否在cli下运行,以免被其他cig下运行的模块直接调用各位小伙伴,请在评论中留下你的见解。

举报/反馈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab中平均函数用法,matlab中怎样在X的指定范围内求y的平均值

有两组数据,前面一组值设为x后面一组设为y。x是坐标的变化范围,y是每个坐标下力的大小,怎样在X的指定范围内求y的平均值??比如下面x范围是从-18.19959641到-18.00003052之内的 怎样求得-18.19959641到-18.18049049这个…

php中gd为什么是乱码的,php gd库中文乱码怎么解决?

php gd库中文乱码怎么解决?,中文,乱码,字符,选项,字体php gd库中文乱码怎么解决?易采站长站,站长之家为您整理了php gd库中文乱码怎么解决?的相关内容。解决方法:1、网站整站使用UTF8编码,如果已使用GB2312…

php观察者模式和注册数模式,PHP观察者模式

观察者模式的核心是允许你的应用程序注册一个回调,当某个特定的事件发生时便会触发它。实现观察者模式,我们使用一个名为Event的类实现它,这个类有2个公共的方法。1. registerCallback() :这个方法允许你用规定的名称附加许多回调到一个事件中…

php实现飘窗,JS实现网站图片飘窗效果,JavaScript悬浮广告(附详细代码)

原标题:JS实现网站图片飘窗效果,JavaScript悬浮广告(附详细代码)JS实现网站图片飘窗效果,Java悬浮广告,郑州SEO提供以下代码,仅供参考:飘窗效果-丁光辉博客(www.dingguanghui.com)*{margin:0px;padding:0px…

php spss,spss新手入门

随着速度越来越快,计算机的功能越来越多,计算统计功能反而已经成为了计算机的一个次要部分.不过,对于我们这些从事社会学学习和研究的人来说,快速的计算和统计仍旧是我们使用计算机的主要功能,所以我们平日的工作总是离不开SPSS(Statistical Package for the SocialScience社会…

load out mysql,快速的mysql导入导出数据(load data和outfile)

当读取位于服务器上的文本文件时,文件必须处于数据库目录或可被所有人读取。1 指定关键词low_priority,MySQL将会等到没有其他人读这个表的时候,才把插入数据。可以使用如下的命令:load data low_priority infile "/home/m…

matlab rem和mod,Matlab的mod和rem

通常取模运算也叫取余运算,它们返回结果都是余数.rem和mod唯一的区别在于:当x和y的正负号一样的时候,两个函数结果是等同的;当x和y的符号不同时,rem函数结果的符号和x的一样,而mod和y一样。这是由于这两个函数的生成机…

php sslv3握手失败,Boost Beast握手:sslv3警报握手失败错误

我正在使用Boost Beast连接到一个Web Socket服务器,但是我一直收到一个错误Resolving push-private.kucoin.com:443...Performing SSL handshake...terminate called after throwing an instance of boost::wrapexcept<:system::system_error>what(): handshake: sslv3 a…

python猜猜我是几,我在python中猜数游戏的问题

我是新手&#xff0c;所以请原谅下面的混乱…我正试图写一个数字猜谜游戏。计算机应该随机生成一个介于1到10之间的数字。用户只允许3次尝试正确猜测数字。一个用户要么猜对了&#xff0c;要么尝试完了&#xff0c;我应该让程序问用户&#xff0c;如果他们想再次玩&#xff0c;…

php pc_base,phpcms二次开发之base.php的桥梁作用_PHP教程

PHPCMS是采用MVC设计模式开发,基于模块和操作的方式进行访问&#xff0c;采用单一入口模式进行项目部署和访问&#xff0c;无论访问任何一个模块或者功能&#xff0c;只有一个统一的入口。入口程序是在前期处理用户请求的引导程序。它是唯一一个可以被最终用户可以直接请求运行…

oracle 表访问,向oracle导入访问表

我在将表导入到oracle时遇到问题。当我导入一个字段是例如导入&#xff1a;在访问我已经20&#xff0c;200 和进口到Oracle‘‘中访问和导入oracle作为‘12535’向oracle导入访问表在访问20’或’125.35它被声明作为数字&#xff0c;并在oracle中它已经改为文本&#xff0c;浮动…

oracle中orand使用,Postgres兼容Oracle研究——orafce调研

一、背景PostgreSQL是和Oracle最接近的企业数据库&#xff0c;包括数据类型&#xff0c;功能&#xff0c;架构和语法等几个方面。甚至大多数的日常应用的性能也不会输给Oracle。但是Oracle有些函数或者包&#xff0c;默认PostgreSQL是没有的&#xff0c;需要安装orafce包来实现…

oracle脚本审核平台,Oracle 脚本(适应各种业务需要)

Oracle 脚本(适应各种业务需要)1. 取A表的数据&#xff0c;更新B表字段update m_build bset b.district_id(select d.district_idfrombjhouse.d_district dwhereb.build_name_jqd.district_name)where exists(select 1frombjhouse.d_district dwhereb.build_name_jqd.district…

linux 文件mtime,linux 文件的atime,ctime,mtime查看與修改

查看ls -a默認顯示的是修改時間ls -c / --timestatus / --timectime顯示的是狀態修改時間(即權限修改時間)ls -u / --timeuse / --timeaccess / --timeatime表示的是文件訪問時間修改touch: 缺少了文件操作數請嘗試執行“touch --help”來獲取更多信息。[weilocalhost ~]$ touc…

linux 内核系统优化,Linux系统内核优化(一)

Linux内核参数调整(用于大并发的WEB服务器)cat > /etc/sysctl.conf net.ipv4.tcp_syncookies 1fs.file-max 999999net.ipv4.tcp_tw_reuse 1net.ipv4.tcp_keepalive_time 600net.ipv4.tcp_fin_timeout 30net.ipv4.tcp_max_tw_buckets 5000net.ipv4.ip_local_port_range…

labview linux 内核 不匹配,Linux CentOS7(或Ubuntu)中安装NI-VISA后一打开范例Simple Serial.vi就闪退,LabVIEW就崩溃。...

Linux CentOS7(或Ubuntu)中安装NI-VISA后一打开范例Simple Serial.vi就闪退&#xff0c;LabVIEW就崩溃。我安装了LabVIEW pro 2017 for Linux(另外也试了2016版的都是一样的效果)&#xff0c;VISA也试了4.1.0、4.4.0、5.1.1、15.0.0、15.5.0、16.0.0、17.0.0版本都试过了&#…

linux内核编译的image,内核编译时生成uImage的办法

有一个很简单的办法u-boot编译结束时&#xff0c;会在tool文件夹下面生成一个mkimage文件&#xff0c;将这个文件复制到交叉编译器目录下的bin文件夹下面&#xff0c;以后编译时就会生成uImage文件&#xff0c;省的用命令行的方式转了&#xff1b;另外将采用命令行的方式也贴出…

linux系统平均价格,简单认识Linux系统平均负载

第一次认识“系统平均负载”是在探针中见到的&#xff0c;一直不明白是什么意思&#xff0c;不明白貌似也不影响使用&#xff0c;就在意了。后来与“系统平均负载”接触的更多&#xff0c;无意间看到了一个形象的比喻&#xff0c;算是对“系统平均负载”有一个简单的认识。load…

linux系统怎么删除打印机,解决LINUX ES3.0下想指定打印机和用户的删除打印作业的问题...

################################################################################ xlprm use for LINUX ES3.0# 可删除指定打印机和指定用户的打印作业# 用法 1)xlprm $1 $2 可指定两个参数 参数一是打印机名 参数2是用户名# 2)xlprm $1 可指定一个参数 参数一是打印记名 然…

linux下快速查找文件,linux中快速查找文件

在使用linux时&#xff0c;经常需要进行文件查找。其中查找的命令主要有find和grep。两个命令是有区的。区别&#xff1a;(1)find命令是根据文件的属性进行查找&#xff0c;如文件名&#xff0c;文件大小&#xff0c;所有者&#xff0c;所属组&#xff0c;是否为空&#xff0c;…