Возможно ли выполнить action Controller в Joomla 3 через cron?

  • 16 Ответов
  • 542 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

Оффлайн Cristoff

Добрый день.

Задача такая, есть Controller компонента в нем есть Action который выполняет какое-то длительное действие.
Это действие нужно выполнять периодически, для этого есть в *nix механизм cron.

Проблема 1: как запустить URL из cron
- тут наверное можно через cURL, но пока не уверен.
И проблема 2, основная: как пройти авторизацию Joomla, чтобы выполнить Action? Или как ее отключить для выполнения из cron.

Action вызывает логику из модели, которая в свою очередь использует другие модели. Перейти от кода Joomla к Native Php проблематично.

Может я не под тем углом смотрю на решение?

*

Оффлайн Aleks.Denezh

Проблема 1:
ложите файл cron.php в корень, настраиваете на него крон а дальше:
file_get_contents('site.ru?index.php?option=com_you_component&task=action.cron')!
В контроллере controllers/action.php выполнит метод cron

Проблема 2:
1. если вы будете делать запрос ссылкой то у вас там же уже будет подключено ядро, просто сделайте Програмную авторизацию  в методе cron!
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

Оффлайн Cristoff

Забыл уточнить, cron нужно использовать к компоненту в приложении administrator не на site.
Я так понял метод контроллера не может выполниться пока не пройдена авторизация. То есть до выполнения метода вообще не дойдет.

Однако, ваши подсказки помогли мне.

Сделал не так красиво как хотелось бы, но работает:
создал файл cron.php
Код: (php) [Выделить]
//указать логин и пароль для пользователя
//*****************************************************************//
$credentials = array('username' => 'admin', 'password' => 'admin');
//*****************************************************************//

define('_JEXEC', 1);
define('cron', 1);
define('JPATH_BASE', dirname(__FILE__));
define('DS', DIRECTORY_SEPARATOR);
require_once(JPATH_BASE . DS . 'includes' . DS . 'defines.php');
require_once(JPATH_BASE . DS . 'includes' . DS . 'framework.php');
//JFactory::getApplication('administrator')->initialise();
$app = JFactory::getApplication('administrator');

jimport('joomla.user.helper');
//В этом массиве параметры авторизации! в данном случае это установка запоминания пользователя
$options = array('remember' => true);
//выполняем авторизацию
if (JFactory::getApplication()->login($credentials, $options)) {
//    echo 'Вы успешно авторизированны';
//    die();
} else {
    echo "error";
}
require_once 'components/com_catalog/controllers/dump.php';
$d = new CatalogControllerDump();
$d->cron();

в файле dump.php пришлось добавить несколько require_once для моделей, таблиц и тд.

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



*

Оффлайн Arkadiy

  • *****
  • 5340
  • [+]440 / [-]0
  • Крепитесь, други.
    • Просмотр профиля
    • http://argens.ru
А я крон на фронтальной части всегда делаю, чтобы отрубить левак - дополнительный пароль в строке запроса.

*

Оффлайн Aleks.Denezh

Забыл уточнить, cron нужно использовать к компоненту в приложении administrator не на site.
Зачем такой бред, делайте на frontend!
Если для безопасности, то это бред! Ибо тот кто узнает строку к крону и запустит так:
site.ru?index.php?option=com_you_component&task=action.cron , то никакого ущерба сайту не нанесет! Ну выполнится один лишний раз крон.. можно дополнительно параметром передать какой то зашифрованный пароль например:
file_get_contents('site.ru?index.php?option=com_you_component&task=action.cron&pwd='.md5(date('d-m-Y'). 'мой пароль') );
и в начале метода cron
if($_GET['pwd'] !== .md5(date('d-m-Y'). 'мой пароль')) exit;

а вот если так:
site.ru/administrator/?index.php?option=com_you_component&task=action.cron
Так же само выполнит задачи крона, только в этом случае ещё и доступ полный к админке получит! ибо вы сделаете процесс авторизации в автомате! и в браузере он будет заполнен, и гуляй душа...
« Последнее редактирование: 20.06.2016, 13:35:51 от Istaan »
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

Оффлайн Cristoff

у меня авторизация проходит до
site.ru/administrator/?index.php?option=com_you_component&task=action.cron
в файле cron.php

а всякий "левак" может отсеять .htaccess или (php_sapi_name() == "cli")

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

Но может вы все и правы, буду пробовать разные варианты.

*

Оффлайн SmokerMan

у меня авторизация проходит до
site.ru/administrator/?index.php?option=com_you_component&task=action.cron
в файле cron.php
нормально)
тогда просто делаешь запрос /cron.php и ты авторизован как админ)

*

Оффлайн Aleks.Denezh

нормально)
тогда просто делаешь запрос /cron.php и ты авторизован как админ)
Та да отличная идея ;D
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

Оффлайн Cristoff

жжоте ребята)
Встречный вопрос
как обойти проверку через запрос к /cron.php
Код: (php) [Выделить]
if(php_sapi_name() == "cli")
echo "pwned";
else die("access denied")
« Последнее редактирование: 20.06.2016, 18:02:21 от Cristoff »

*

Оффлайн SmokerMan

жжоте ребята)
Встречный вопрос
как обойти проверку через запрос к /cron.php
уже ответили выше, вынести контроллер на фронт и запускать его с каким-нибудь ключем
Цитировать
index.php?option=com_you_component&task=action.cron&pwd='.md5(date('d-m-Y'). 'мой пароль') );
тогда не будет никакого головняка с авторизацией

*

Оффлайн Aleks.Denezh

Зачем вообще проходить процедуру авторизации! Все данные по базе можно разнести без этого! И не использовать проверок и ACL! Это лишнее при кроне!
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

Оффлайн Cristoff

Зачем вообще проходить процедуру авторизации! Все данные по базе можно разнести без этого! И не использовать проверок и ACL! Это лишнее при кроне!
Храню информацию о пользователе совершившем действие.
Вообще задача была простая. Выполнить метод из контроллера, можно даже и не из контроллера (модели), не важно. Подключив ядро Joomla все стало возможным.

*

Оффлайн Aleks.Denezh

Храню информацию о пользователе совершившем действие.
Вообще задача была простая. Выполнить метод из контроллера, можно даже и не из контроллера (модели), не важно. Подключив ядро Joomla все стало возможным.
У вас в кроне в любом случае будет все от одного пользователя выполняться
и вот какая разница сделаете вы авторизацию по вбитому вручную логину и паролю, или сразу подставите нужный ID юзера в скрипте?!
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

Оффлайн Cristoff

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

*

Оффлайн Aleks.Denezh

Разница в том, о чем я уже говорил раньше, что логика крона может работать и из админки, а там могут быть разные пользователи.
И это решается одной строкой..
$userId = JFactory::getUser()->guest ? 555 : JFactory::getUser()->id;
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

Оффлайн Cristoff

Ребята о чем речь?)
Успокойтесь. Вопрос решен.
Все бы так помогали в решении вопросов. На тостере ответа не нашел, решил попытать удачи в этом форуме и результат не заставил себя ждать.

Я вроде бы решил все траблы с Joomla во втором посте этого вопроса, за это отдельное спасибо Istaan.

Тему можно закрывать.


*

Оффлайн Aleks.Denezh

На тостере ответа не нашел..
Вы бы ещё на микроволновке поискали ;D
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016