将CLI PHP与CakePHP集成

时间:2011-09-30 14:03:06

标签: php cakephp cakephp-1.3 command-line-interface

我有一个运行良好的CakePHP 1.3.11站点,我需要运行一个计划的维护CLI脚本,所以我用PHP编写它。有没有办法制作一个蛋糕友好的脚本?理想情况下,我可以使用Cake的函数和Cake的数据库模型,CLI需要数据库访问,而不是其他。理想情况下,我希望将CLI代码包含在控制器中,将数据源包含在模型中,这样我就可以像调用任何其他Cake函数一样调用该函数,但只能从CLI调用这个函数。

搜索CakePHP CLI主要会带来有关CakeBake和cron作业的结果; this article听起来非常有用,但它适用于旧版蛋糕,需要修改版本的index.php。我不再确定如何更改文件以使其在新版本的cakePHP中运行。

如果重要的话,我在Windows上,但我可以完全访问服务器。我目前正计划安排一个简单的cmd“php run.php”样式脚本。

2 个答案:

答案 0 :(得分:5)

使用CakePHP的shell,您应该能够访问所有CakePHP应用程序的模型和控制器。

作为一个例子,我设置了一个简单的模型,控制器和shell脚本:

/app/models/post.php

<?php
class Post extends AppModel {
    var $useTable = false;
}
?>

/app/controllers/posts_controller.php

<?php
class PostsController extends AppController {

var $name = 'Posts';
var $components = array('Security');

    function index() {
        return 'Index action';
    }
}
?>

/app/vendors/shells/post.php

<?php

App::import('Component', 'Email'); // Import EmailComponent to make it available
App::import('Core', 'Controller'); // Import Controller class to base our App's controllers off of
App::import('Controller', 'Posts'); // Import PostsController to make it available
App::import('Sanitize'); // Import Sanitize class to make it available

class PostShell extends Shell {
    var $uses = array('Post'); // Load Post model for access as $this->Post

    function startup() {
        $this->Email = new EmailComponent(); // Create EmailComponent object
        $this->Posts = new PostsController(); // Create PostsController object
        $this->Posts->constructClasses(); // Set up PostsController
        $this->Posts->Security->initialize(&$this->Posts); // Initialize component that's attached to PostsController. This is needed if you want to call PostsController actions that use this component
    }

    function main() {
        $this->out($this->Email->delivery); // Should echo 'mail' on the command line
        $this->out(Sanitize::html('<p>Hello</p>')); // Should echo &lt;p&gt;Hello&lt;/p&gt;  on the command line
        $this->out($this->Posts->index()); // Should echo 'Index action' on the command line
        var_dump(is_object($this->Posts->Security)); // Should echo 'true'
    }
}

?>

整个shell脚本用于演示您可以访问:

  1. 直接加载但未通过控制器加载的组件
  2. 控制器(首先导入Controller类,然后导入您自己的控制器)
  3. 控制器使用的组件(创建新控制器后,运行constructClasses()方法,然后运行特定组件的initialize()方法,如上所示。
  4. 核心实用程序类,如上面显示的Sanitize类。
  5. 模型(仅包含在shell的$uses属性中)。
  6. 你的shell可以有一个始终先运行的启动方法,以及main方法,它是你的shell脚本主进程,在启动后运行。

    要运行此脚本,您需要在命令行中输入/path/to/cake/core/console/cake post(可能必须检查在Windows上执行此操作的正确方法,该信息位于CakePHP手册中(http://book.cakephp.org)。 / p>

    上述脚本的结果应为:

    mail
    &lt;p&gt;Hello&lt;/p&gt;
    Index action
    bool(true)
    

    这对我有用,但也许那些在CakePHP shell中更先进的人可以提供更多的建议,或者可能更正上面的一些......但是,我希望这足以让你开始。

答案 1 :(得分:0)

从CakePHP 2开始,shell脚本现在应保存到\ Console \ Command。 http://book.cakephp.org/2.0/en/console-and-shells.html

上有很好的文档