Интеграция CLI PHP с CakePHP


У меня есть хороший функционирующий сайт CakePHP 1.3.11, и мне нужен сценарий CLI для выполнения запланированного обслуживания, поэтому я пишу его на PHP. Есть ли способ сделать сценарий, дружественный к торту? В идеале я мог бы использовать функции Cake и модели базы данных Cake, CLI требует доступа к базе данных и не более того. В идеале я хотел бы включить свой код CLI в контроллер и источник данных в модель, чтобы я мог вызвать функцию, как и любую другую функцию Cake, но только из CLI в качестве sheduled задача.

Поиск CakePHP CLI в основном приносит результаты о заданиях CakeBake и cron; Эта статья звучала очень полезно, но она предназначена для старой версии cake и требует модифицированной версии index.РНР. Я больше не знаю, как изменить файл, чтобы он работал в новой версии cakePHP.

Я на Windows, если это имеет значение, но у меня есть полный доступ к серверу. В настоящее время я планирую запланировать простой запуск cmd "php.скрипт в стиле php.

2 2

2 ответа:

Используя оболочки CakePHP, вы должны иметь доступ ко всем моделям и контроллерам вашего приложения CakePHP.

В качестве примера я настроил простую модель, контроллер и скрипт оболочки:

/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'
    }
}

?>

Весь сценарий оболочки предназначен для демонстрации того, что вы можете иметь доступ к:

  1. компоненты, которые загружаются непосредственно и которые не загружаются через контроллер
  2. контроллеры (сначала импортируйте класс контроллера, затем импортируйте свой собственный контроллер)
  3. компоненты, используемые контроллерами (после создания нового контроллера запустите метод constructClasses(), а затем метод конкретного компонента initialize(), как показано выше.
  4. основные служебные классы, такие как класс Sanitize, показанный выше.
  5. модели (просто включите в свойстве вашей оболочки $uses).

Ваша оболочка может иметь метод запуска, который всегда выполняется во-первых, и основной метод, который является вашей оболочкой скриптов основного процесса и который запускается после запуска.

Чтобы запустить этот скрипт, вы должны ввести /path/to/cake/core/console/cake post в командной строке (возможно, придется проверить правильный способ сделать это в Windows, информация находится в книге CakePHP (http://book.cakephp.org).

Результатом приведенного выше сценария должно быть:

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

Это работает для меня, но, возможно, люди, которые более продвинуты в оболочках CakePHP, могли бы предложить больше советов, или, возможно, исправьте некоторые из вышеперечисленных ошибок... Тем не менее, я надеюсь, что этого достаточно, чтобы вы начали.

Начиная с CakePHP 2, сценарии оболочки теперь должны быть сохранены в \Console\Command. Есть хорошая документация по адресу http://book.cakephp.org/2.0/en/console-and-shells.html