IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> cakephp2.x Shell 调用Controller里的action, -> 正文阅读

[JavaScript知识库]cakephp2.x Shell 调用Controller里的action,

环境

  • php:7.1
  • cakephp:2.x
  • CentOS Linux release 7.4.1708?

确认cakephp的console是否可以正常工作

#cd 到项目app目录下
$ cd /path/to/cakephp/app
$ ./Console/cake

不加参数执行完后,执行结果如下:

Welcome to CakePHP v2.10.11 Console
---------------------------------------------------------------
App : app
Path: D:\www\pia-account-mst\HankyuHanshinPartrol\HankyuHanshinManagement\app\
---------------------------------------------------------------
Current Paths:

 -app: app
 -working: D:\www\pia-account-mst\HankyuHanshinPartrol\HankyuHanshinManagement\app
 -root: D:\www\pia-account-mst\HankyuHanshinPartrol\HankyuHanshinManagement
 -core: D:\www\pia-account-mst\HankyuHanshinPartrol\HankyuHanshinManagement\app\Vendor\cakephp\cakephp\lib
 -webroot: D:\www\pia-account-mst\HankyuHanshinPartrol\HankyuHanshinManagement\app\webroot

Changing Paths:

Your working path should be the same as your application path. To change your path use the '-app' param.
Example: -app relative/path/to/myapp or -app /absolute/path/to/myapp

Available Shells:

[CORE] acl, api, bake, command_list, completion, console, i18n, schema, server, test, testsuite, upgrade

[app] sea

To run an app or core command, type cake shell_name [args]
To run a plugin command, type cake Plugin.shell_name [args]
To get help on a specific command, type cake shell_name --help

创建测试Shell

Console/Command 目录下创建?HelloShell.php

class HelloShell extends AppShell {
    public function main() {
        $this->out('Hello world.');
    }
}
通常,shell 类使用 Shell 后缀来命名文件。在这个 shell 中创建 main() 方法。当 shell 在没有附加命令(参数)的情况下启动时调用此方法。在此之后,我们将添加一些命令,但现在让我们启动 shell。在您的应用程序目录 (app) 中,执行以下操作:

(linux 需要将Console/cake文件权限改为可执行的)

Console/cake hello

执行结果:


Welcome to CakePHP v2.10.11 Console
---------------------------------------------------------------
App : app
Path: /var/www/HankyuHanshinPartrol/HankyuHanshinManagement/app/
---------------------------------------------------------------
Hello world.
如上所述,shell 的 main() 方法是一个特殊的方法,当没有其他命令或参数给 shell 时,它总是被调用。 HelloShell 是 AppShell 的扩展。与 AppController 一样,AppShell 提供了一个包含所有常用功能和逻辑的基本类。 AppShell 是通过创建 app/Console/Command/AppShell.php 来定义的。如果这不存在,CakePHP 将使用内置的。现在您已经在一定程度上知道了如何使用 main 方法,让我们添加另一个命令,如下所示。
class HelloShell extends AppShell {
    public function main() {
        $this->out('Hello world.');
    }

    public function hey_there() {
        $this->out('Hey there ' . $this->args[0]);
    }
}
创建这个文件并运行 Console / cake hello hey_there your_name,你应该看到你的名字。上例中的 hey_there 方法使用了 $this->args。它将给定命令的参数(指定的顺序有意义)保存为给定顺序的数组。你也可以在你的 shell 应用程序中使用开关和选项,它们可以通过 $this->params 或 param() 方法来引用,但这里我们只指明属性名称。

使用 main () 方法时不能引用位置参数。这是因为指定为第一个参数的参数或选项被解释为命令名称。如果要使用参数或选项,则需要使用非 main 的其他方法名称。

Shell中调用Controller

<?php

//controller
App::uses('AppController', 'Controller');
App::uses('SendMailsController', 'Controller');

class KeywordShell  extends AppShell
{
    public function main(){
    	$this->out('Hello world.');
    }
    
    /**
     * check_keyword
     * */
    public function check_keyword(){
    	$this->out('Shell start.');
    	$c=new SendMailsController();
    	$res = $c->check_keyword();
    	$this->out('Shell end.');
    }

}

将 shell 加到 cronjob 中

在 Console 目录下创建.sh文件,? 我的是 CakeShell.sh

#!/bin/bash
# 执行dealTransferredCmd.php的命令

today=`date "+%Y%m%d"`

source /etc/bashrc

cd /your/path/to/app && Console/cake keyword check_keyword >>/home/fan.haihong/cron-keyword-${today}.log

追加cronjob

先查看现存定时任务: crontab -l

编辑定时任务: crontab -e

此时,是不可编辑状态, 输入小写 a,变为可编辑模式

将下面的命令加到最后:

*/1 * * * * sh /var/www/HankyuHanshinPartrol/HankyuHanshinManagement/app/Console/CakeShell.sh >>/home/someone/cake.sh.log 2>&1

ctrl + c ,退出编辑模式
Shift + w + q?退出编辑
wq 回车,保存编辑

crontab -l ,确认任务是否加好了

一分钟后,确认log,看任务是否正常启动,且命令是否被执行了

以上是各种测试后调通后的流程。

测试过程中遇到的各种问题小节:

1. 执行 Console/cake,报错了,我的项目里边需要定义一个环境变量?PROGRAM_TOOL_ENV,该变量是表示是测试环境还是生产环境的

最后解决办法 请参考之前的文章的方法四:?Linux环境变量配置全攻略_moamao_jishuyuan的博客-CSDN博客

上边sh文件里的??source /etc/bashrc 这句命令就是解决这个问题的

2. 遇到的第二个问题就是,以?cd /your/path/to/app && Console/cake keyword check_keyword >>/home/fan.haihong/cron-keyword-20220225.log? 该命令为例,在 bash窗口手动执行的话,很正常,log也写到log文件里去了,但是, 但是 直接 将该命令加到 crontab 的任务 list 后,shell 就调不起来了,log 也写不进去

直接添加到crontab的命令如下:

#该命令有误
cd /your/path/to/app && Console/cake keyword check_keyword >>/home/fan.haihong/cron-keyword-20220225.log

后来差别的,才发现,是命令写错了,命令后边加上 2>&1 后,log就可以写进去了,修改后的命令如下:

cd /your/path/to/app && Console/cake keyword check_keyword >>/home/fan.haihong/cron-keyword-20220225.log 2>&1

修改后,log虽然写进去了,但是 log 里又有报错信息了,信息同 问题1 是一样的,没有检测到环境变量,可是我之前明明把环境变量加到?/etc/bashrc 文件里了呀,为什么还会报这个错呢?然后重新回到那篇文章研究发现:?

?

然后,我就将?source /etc/bashrc? 加到 crontab 任务命令前边,修改如下

?好了,log里虽然不报环境变量的问题了,但是shell还是没有调起来呀

最后,我试着写了个 CakeShell.sh? ,这下调通了,邮件也发了完美

虽然,我还是不知道命令直接写到 crontab 任务list 里为什么 shell 掉不起来,但是,好歹调通了,可以进行下一步了,万岁

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:22:00  更:2022-02-26 11:22:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:25:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码