Интеграция 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 ответа:
Используя оболочки 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 <p>Hello</p> 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' } } ?>
Весь сценарий оболочки предназначен для демонстрации того, что вы можете иметь доступ к:
- компоненты, которые загружаются непосредственно и которые не загружаются через контроллер
- контроллеры (сначала импортируйте класс контроллера, затем импортируйте свой собственный контроллер)
- компоненты, используемые контроллерами (после создания нового контроллера запустите метод
constructClasses()
, а затем метод конкретного компонентаinitialize()
, как показано выше.- основные служебные классы, такие как класс Sanitize, показанный выше.
- модели (просто включите в свойстве вашей оболочки
$uses
).Ваша оболочка может иметь метод запуска, который всегда выполняется во-первых, и основной метод, который является вашей оболочкой скриптов основного процесса и который запускается после запуска.
Чтобы запустить этот скрипт, вы должны ввести
/path/to/cake/core/console/cake post
в командной строке (возможно, придется проверить правильный способ сделать это в Windows, информация находится в книге CakePHP (http://book.cakephp.org).Результатом приведенного выше сценария должно быть:
mail <p>Hello</p> Index action bool(true)
Это работает для меня, но, возможно, люди, которые более продвинуты в оболочках CakePHP, могли бы предложить больше советов, или, возможно, исправьте некоторые из вышеперечисленных ошибок... Тем не менее, я надеюсь, что этого достаточно, чтобы вы начали.
Начиная с CakePHP 2, сценарии оболочки теперь должны быть сохранены в \Console\Command. Есть хорошая документация по адресу http://book.cakephp.org/2.0/en/console-and-shells.html