本文内容

  1. laravel-admin创建命令行脚本
  2. 通过screen管理脚本执行

我们在使用laravel-admin做管理后台开始时难免会遇到需要使用脚本在后台跑一些任务的情况。laravel框架给我们提供了方便的创建命令行脚本的方法,由于laravel-admin是基于laravel的,所以同样可以使用该方法。

一、laravel-admin创建命令行脚本

通过如下命令快速生成一个命令行脚本文件,其中cmd_name为自定义的命令Class名称。

$> php artisan make:command cmd_name 

生成的脚本文件内容如下:

<?phpnamespace AppConsoleCommands;use IlluminateConsoleCommand;class CmdTest extends Command {      /**     * 控制台命令 signature 的名称。     *     * @var string     */    protected $signature = 'catch:source';    /**     * 控制台命令说明。     *     * @var string     */    protected $description = '命令说明描述';    /**     * 创建一个新的命令实例。     *     * @return void     */    public function __construct()    {        parent::__construct();    }    /**     * 执行控制台命令。     *     * @return mixed     */    public function handle()    {      }

生成类文件后,我们需要做如下修改来让脚本按照我们的预期执行:

  1. $signature 该属性定义脚本的调用名称以及命令行参数

例如:

protected $signature = 'catch:source'; //signature定义$> php artisan catch:source //调用命令

那么我们来看看如何定义命令行参数

在signature属性的命令名称后开始定义命令行参数,例如:

protected $signature = 'catch:source {day}';$> php artisan catch:source 20200710 //调用命令

这样我们就定义了一个名称为 day 的必选命令行参数。

{day?} 定义可选命令行参

{day=20200710} 定义参数的默认值

同样的方式我们还可以定义命令行选项,例如

protected $signature = 'catch:source {day} {--queue}';$> php artisan catch:source 20200710 --queue //调用命令

不带值的选项参数表示一个开关,执行命令时加上该选项时表示开关打开(true),否则为关闭(false)。

protected $signature = 'catch:source {day} {--queue=}';$> php artisan catch:source 20200710 --queue=123 //调用命令

选项我们还可以定义简写

protected $signature = 'catch:source {day} {--q|queue=}'; //简写选项放在选项名称前,并用竖线"|"分隔

命令行参数还可以通过在参数名后加星号"*"来表示参数是一个数, 例如:

protected $signature = 'catch:source {day*} {queue=*}';//如果选项参数是数组时,调用命令时需要每个元素都加上选项前缀,如php artisan catch:source --queue=1 --queue=2 ...

命令行参数我们定义好了,那么该如何获取到该参数的值呢?

  1. handle 该方法的定义命令逻辑的入口
public function handle(){    stream_context_set_default(array(        'ssl' => array(            'peer_name'          => 'generic-server',            'verify_peer'        => FALSE,            'verify_peer_name'   => FALSE,            'allow_self_signed'  => TRUE    )));      $day = $this->argument('day');//获取命令行参数    //$queueName = $this->option('queue'); //获取选项参数值    //$options = $this->options(); //获取所有选项值    if (empty($day)) {        $day = date("Ymd", time()-3600*24);    }    $fileUrl = "https://www.xxx.com/{$day}/download.tsv";    $dataList = $this->csvContentToArray(file_get_contents($fileUrl, false));}private function csvContentToArray(String $content){    //文件内容处理逻辑}

以上方法只是简单的获取一个网络文件的内容。

这里插一句题外话,我们发现在调用file_get_contents前调用了stream_context_set_default,并且设置了file_get_contents第二个参数设置成了false。这是为什么呢?

当我们请求https资源时可能会遇到类似 Peer certificate CN=`*.xxx' did not match expected CN=`xxx’ 的错误。

我们可以通过 stream_context_set_default 函数调用 与 file_get_contents 的第二个参数false 用来屏蔽这个错误,如上代码。

二、通过screen管理脚本执行

screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口。

本文只是简单介绍使用screen管理后台运行的进程,更多的用法请参考screen文档

http://www.gnu.org/software/screen/manual/html_node/index.htmlhttps://www.ibm.com/developerworks/cn/linux/l-cn-screen/index.html
$> screen -S 会话名 //新建一个session

上面命令回车后就进入了新的会话,在会话中我们可以执行后台运行的脚本

$> php artisan catch:source 20200710 --queue=123 >> run.log 2>>run.log 或 (&1)$> ctrl + a + d //输入ctrl a d来中断会话,进入Detached状态

这样我们的任务是脱落终端运行的,即使关闭ssh连接进程还是在后台运行。

$> screen -ls //列出所有的会话There is a screen on:    16582.catch:source  (Detached)1 Sockets in /var/run/screen/S-root.//会话pid.会话名 (会话状态), 本例会话pid为16582,会话名为catch:source
$> screen -r  //重新进入Detached状态的会话

当我们想要退出某一个会话以及其中运行的任务,可进行如下操作:

//screen -X -S  quit$> screen -X -S 16582 quit

附:

如果我们想通过crontab来定时执行后台运行的任务(运行时间较长的任务),可以通过flock来防止crontab启动重复的进程。

*/1 * * * * flock -xn /var/catch_source.lock -c "cd /var/; php artisan catch:source" >> /var/log/catch_source.log

以上就是laravel-admin命令行脚本以及screen在项目中用到的简单用法,在这里做个备忘,也希望对大家能有些许的帮助。

命令行_Laravel-admin artisan 命令行脚本使用相关推荐

  1. 【Android 命令行工具】Android 命令行工具简介 ( 官方文档 | SDK 命令行工具 | SDK 构建工具 | SDK 平台工具 | 模拟器工具 | Jetifier 工具 )

    文章目录 一.官方文档 二.Android 命令行工具简介 1.SDK 命令行工具 2.SDK 构建工具 3.SDK 平台工具 4.模拟器工具 5.Jetifier 工具 一.官方文档 Android ...

  2. HDFS命令行客户端使用,命令行客户端支持的命令参数,常用命令参数介绍

    3.HDFS的shell(命令行客户端)操作 3.1 HDFS命令行客户端使用 HDFS提供shell命令行客户端,使用方法如下: [toto@hadoop hadoop-2.8.0]$ hdfs d ...

  3. linux命令行如何换行,一行命令太长,看的不清晰,

    linux命令行如何换行,一行命令太长,看的不清晰, 1.如图是列子; 2."\"  +ENTER 就可以实现换行 3.还有一个linux命令行的相关操作;ctrl+a, ctrl ...

  4. 在Matlab命令窗口中执行,交互式命令操作就是在MATLAB命令行窗口中输入命令并执行。...

    交互式命令操作就是在MATLAB命令行窗口中输入命令并执行. 答:√ 中国大学MOOC: 一侧肾切除后,另一留存肾会长得更加硕大,这种生理现象称为 . 答:代偿 Street jazz 的编舞师都会有 ...

  5. linux shell运行脚本命令行参数,shell脚本命令行参数简介

    之所以用到命令行参数,关键在于shell脚本需要与运行脚本的人员进行交互. bash shell提供了命令行参数添加在命令后面的数据值).命令行选项修改命令行为的单字符值)和直接读取键盘输入. 1.命 ...

  6. 详解Linux命令行下常用svn命令

    2019独角兽企业重金招聘Python工程师标准>>> 本文讲述了Linux命令行下常用svn命令的使用方法,希望对您有所帮助. 1.Linux命令行下将文件checkout到本地目 ...

  7. Windows命令行下常用网络命令解释大全

    命令行下常用网络命令解释大全 1.Arp 显示和修改"地址解析协议"(ARP) 所使用的到以太网的 IP 或令牌环物理地址翻译表.该命令只有在安装了 TCP/IP 协议之后才可用. ...

  8. Python 打造基于有道翻译的命令行翻译工具(命令行爱好者必备)

    Python 打造基于有道翻译的命令行翻译工具(命令行爱好者必备) 之前基于百度写了一篇博文 Python 打造基于百度翻译的命令行翻译工具,本来这工具用得挺好的.但是没想到,近期处于不知道啥原因,不 ...

  9. mysql 命令行 格式化输出_MySQL命令行格式化输出

    使用G按行垂直显示结果 如果一行很长,需要这行显示的话,看起结果来就非常的难受.在SQL语句或者命令后使用G而不是分号结尾,可以将每一行的值垂直输出.这个可能也是大家对于MySQL最熟悉的区别于其他数 ...

  10. dos下编写java程序_在DOS命令行状态下,如果命令java Hello成功运行了程序,那么下面哪些叙述是正确的()...

    [判断题]在JDK命令行开发工具中,用编译程序javac.exe编译生成的文件是二进制可执行文件. [论述题]你认为堂吉诃德是一个怎样的人? [简答题]练习函数 [单选题]下列制度体现商法提高交易效率 ...

最新文章

  1. 串口接收数据与分析处理
  2. std::bind技术内幕
  3. Git使用汇总之git checkout -- <file>的真正用法
  4. 树莓派3 64linux,树莓派3 model b安装64位debian+qt5.9
  5. java的内省有用么_JAVA中的内省使用
  6. mysql怎么查看是否存在死锁_mysql怎么查看有没有死锁
  7. sql parser
  8. java post 打开新页面_JAVA后台POST/GET访问方法
  9. 分享实录 | 单人开发场景下的测试环境实践
  10. HDU 2064:汉诺塔III
  11. 程序包com.sun.istack.internal不存在
  12. 易优模板标签生成器发布(2018.9.12)
  13. c#学习笔记01——引用类
  14. php server 不支持,SQL server不支持utf8 php却用utf8的矛盾问题解决方法
  15. R语言之——字符串处理函数
  16. 离线网页制作器(beta1.0)
  17. mac 设置网页字体
  18. 用python统计字母个数_如何用python统计字符串中字母个数?
  19. 【R语言】敏感度、特异度、准确率检验及置信区间求解
  20. [转]仙剑4破解方法详解(免激活刻盘法)--仙剑爱好者看看[图]

热门文章

  1. python etree pandas_python爬虫Xpath,pandas示例
  2. 余世维台湾经典讲座--管理者的EQ(一)
  3. 世界首富比尔盖茨花钱全过程!
  4. 美一好创始人驾驶蔚来ES8启用自动驾驶后发生交通事故不幸逝世
  5. 荣耀:目前还在观望鸿蒙,未来的对手是苹果
  6. 疑似iPhone 13 mini原型机曝光:后置相机模组排布方式变化
  7. 刘慈欣、Netflix联手!《三体》系列将拍摄剧集,但编剧被网友疯狂吐槽
  8. 别想了:全系iPhone12将不配120Hz高刷屏
  9. 美国三大股指周五收高 费城半导体指数逆势微跌0.33%
  10. 人脸识别腾讯安排上了!孩子不能再任意冒用家长身份信息