laravel-admin创建命令行脚本
通过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()
{
}
生成类文件后,我们需要做如下修改来让脚本按照我们的预期执行:
$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 ...
命令行参数我们定义好了,那么该如何获取到该参数的值呢?
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 <会话pid> //重新进入Detached状态的会话
当我们想要退出某一个会话以及其中运行的任务,可进行如下操作:
//screen -X -S <会话pid> 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在项目中用到的简单用法,在这里做个备忘,也希望对大家能有些许的帮助。
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.5amiao.com/baike/1106.html