2013-09-24 3 views
4

Привет, я хочу выполнить функцию через cronjob, чтобы начать импорт csv. На данный момент импорт запускается путем доступа к контроллеру в браузере tld.de/UpdateВыполнение функции в Silverstripe через Cronjob

Контроллер этот код http://pastie.org/8351266

Как я могу выполнить функцию Init() через Cronjob?

Thx!

ответ

5

В SilverStripe вы можете получить доступ к любому маршруту, доступному через HTTP, также запустив cli-script.php в командной строке

Там также sake который только Баш оберткой CLI-script.php (но ради должен быть установлен)

так, из директории вашего проекта, вы можете запустить обе команды, которые будут выполнять те же действия (в этот случай, запустить Dev/сборки):

php framework/cli-script.php dev/build 
sake dev/build 

увидеть документы для командной строки ussage из SilverStripe: http://doc.silverstripe.org/framework/en/topics/commandline


2-ая часть вашего вопроса (как вызвать метод от сети переменного тока ontroller) на самом деле больше вопрос о маршрутизации в silverstripe и не имеет никакого отношения к тому, как он называется (cronjob)

Я предполагаю, что ваш контроллер является Page_Controller или подкласс этого (так привязанный к SiteTree Model) то для вас выполняется маршрутизация (для URL-адресов, установленных в CMS). так что позволяет увидеть некоторые примеры кода и позволяет предположить, у вас есть страница с URLSegment about:

class Page_Controller extends ContentController { 
    private static $allowed_actions = array('something'); 
    public function init() { 
     // the init method will run before every action 
     // this means this code will run, no matter if you visit /about or /about/something 
    } 
    public function index() { 
     // this is the default action (this code is optional and can be removed), 
     // and will be called if you visit website.com/about 
     return $this; 
    } 
    public function something() { 
     // this is the somethingaction, 
     // and will be called if you visit website.com/about/something 
     // do something here 
     return $this; 
    } 
} 

вы можете вызова работать, чтобы получить результат index():

php framework/cli-script.php about 

и это, чтобы получить результат something():

php framework/cli-script.php about/something 

ПРИМЕЧАНИЕ: INIT встретились hod сам не доступен по URL-адресу, это «настройка», которая выполняется до начала действия.
ПРИМЕЧАНИЕ: все действия, отличные от index(), должны быть разрешены путем добавления их в $allowed_actions (также обратите внимание, что вам необходимо? flush = 1 после добавления в $allowed_actions перезагрузить кэш конфигурации)

EDIT: это было на самом деле ответ на ваш первый вопрос, после того, как видеть ваш пример кода, это дополнение:

для автономных контроллеров это работает точно так же, просто вам нужно определить маршруты и убедиться, что у вас есть $Action в r чтобы something() можно было бы назвать

+0

hi zauberfisch, я попытался запустить dev/build через ssh-терминал, как вы сказали выше, но я получаю следующую ошибку:> X-Powered-By: PHP/4.4.9 Тип контента: текст/html
ошибка синтаксического анализа: ошибка синтаксиса, неожиданный T_OBJECT_OPERATOR в _testpage/рамочный/ядра/core.php на линии
', если я использую/USR/местные/бен/php54 ... я застревают на входе сообщение, и если я использую php-cli. putty сообщает мне, что команда не найдена – invictus

+0

ну, первое сообщение об ошибке, очевидно, является ошибкой из-за низкой версии php. использование новой версии php, как вы делали с php54, является решением. Но я не понимаю, что вы подразумеваете под «застряли в сообщении для входа» – Zauberfisch

+0

, если страница не находится в режиме dev. Я получаю следующий вывод -> http://www.sspaste.com/paste/show/5256860510ca9 Я думаю Мне нужно как-то войти в систему, но как? – invictus

1

См Zauberfisch's answer для полного решения

Я не знаком с SilverStripe, но если я правильно понимаю, эта функция контроллера init может быть вызвана с помощью запроса HTTP.

Как говорят SilverStripe документы, вы можете вызвать любой URL из командной строки:

php framework/cli-script.php Update/init 

Более подробная информация доступна here, и рассмотреть вопрос об использовании sake для решения этой задачи.

+0

Этот ответ находится на правильном пути, но метод Init() контроллеров в silverstripe недоступен таким образом, так как это настройка контроллера, так сказать. – Zauberfisch

+0

ah okay thanks, я проверю его, посмотрим, что получится @ Зауберфиш, поэтому мне просто нужно переименовать эту функцию? – invictus

+0

Я написал полный ответ, я думаю, что он должен покрыть этот вопрос, если нет, не стесняйтесь снова спрашивать – Zauberfisch

0

Я думаю, что правильный способ сделать это создать PHP файл консоль, как:

#!/usr/bin/env php 
<?php 

require_once "/path/to/your/class/Update.php"; 
$class = new Update(); 
$class->init(); 

Добавить правую завивку в этот файл

chmod 755 consolefile 

И, наконец, запустить этот скрипт с cronjob

+0

Привет! но после выполнения cronjob я получаю эту ошибку
Ошибка синтаксического анализа: ошибка синтаксиса, неожиданный T_STRING, ожидая T_OLD_FUNCTION или T_FUNCTION или T_VAR или '}' в /Kunden/хххх/Webspace/хххх/MySite/код/Update.php on line
invictus

+0

Как вы выполняете этот скрипт? – Mauro

+0

Кстати, ошибка в вашем классе Update. – Mauro

2

Почему бы не создать задачу сборки? который специально разработан для таких требований (по-крайней мере, как я считаю, строить задачи)

<?php 
    class ArticleCsvUpdateTask extends BuildTask { 

    protected $title = 'Article Csv Update'; 

    protected $description = 'Build task for article Csv update'; 

    public function run($request) { 
     $loader = new ArticleCsvBulkLoader('Color'); 
     if($loader->load('import-new.csv')) { 
      $loader->load('import-new.csv'); 
     } 
    } 
} 

Что можно оценить как из браузера, используя «YourSite/Dev/задачи/ArticleCsvUpdateTask» и из командной строки с помощью " php framework/cli-script.php dev/tasks/ArticleCsvUpdateTask «ИЛИ использовать» сакэ/задачи/ArticleCsvUpdateTask "(если вы уже установлены).

Может быть, я не получаю ваше точное требование, но я считаю, что это намного более чистый и приятный способ запустить работу cron с помощью silverstripe.

5

Вы можете сделать это без использования салата из Silverstripe. Установите ротор и вызовите URL через cronjob, то есть:

0 0 * * * curl --silent http://tld.de/Update 

Правильный способ сделать это было бы написать задачу SilverStripe и вызывать контроллер внутри задачи. Я не проверял этот код, но он бы что-то вроде этого:

class YourTask extends BuildTask { 
    public $description = "..."; 
    //... 
    public function run($request) { 
     YourController::init(); 
    } 
} 

Вы можете вызвать его на имя с помощью:

0 0 * * * /path/to/framework/sake dev/tasks/YourTask 
Смежные вопросы