[РЕШЕНО] Использование modx в фоновом скрипте
Пытаюсь сделать обновление опций товаров в minishop2 в фоновом режиме.
Для этого использую gearman
Написал скрипт, который должен обрабатывать очереди. В нем я инициализирую modx.
Но почему-то, когда скрипт обрабатывает первое задание из очереди, то modx нормально подключается и все отрабатывает, я получаю нужные мне опции товара. Когда он берет следующую задачу, то не может получить опции товара.
Не понимаю в чем проблема. Скрипт запускается в фоновом режиме.
При последующих урл не выводит
UPD
В лог modx записывается следующая ошибка
[2018-09-12 20:49:18] (ERROR @ /var/www/site.ru/core/xpdo/xpdo.class.php: 1826) No foreign key definition for parentClass: msProduct using relation alias: Data
[2018-09-12 20:49:18] (ERROR @ /var/www/site.ru/core/xpdo/xpdo.class.php: 1289) Could not get table name for class: msProductData
UPD
Задача решена. Помогли на возмездной основе.
Если кто-то столкнется, решение следующее.
Написал скрипт, который должен обрабатывать очереди. В нем я инициализирую modx.
Но почему-то, когда скрипт обрабатывает первое задание из очереди, то modx нормально подключается и все отрабатывает, я получаю нужные мне опции товара. Когда он берет следующую задачу, то не может получить опции товара.
Не понимаю в чем проблема. Скрипт запускается в фоновом режиме.
define('MODX_API_MODE', true);
require_once __DIR__ . '/gearman/QueyWorker.php';
try {
$worker = new QueyWorker();
$worker->addCallback('updatePrice', 'updatePrice_worker')->run();
} catch (Exception $e) {
ToLogValue($e->getMessage());
}
function updatePrice_worker($job) {
$workload = $job->workload();
$JSON_DATA = json_decode($workload, true);
ToLogValue("<h1>START UPDATE PRODUCT WITH ID {$JSON_DATA['ID']}</h1>");
FullUpdateItem($JSON_DATA['ID']);
return true;
}
//FullUpdateItem(75);
function FullUpdateItem($id) {
require __DIR__ . '/index.php';
$po = $modx->getObject('msProductOption', array('product_id' => $id, 'key' => 'site_url'));
ToLogValue("Site url for product id=".$id." is ".$po->value);
}
function ToLogValue($message) {
file_put_contents(__DIR__ . '/queue_update_log.html', $message . "\r\n", FILE_APPEND);
}
Т.е. при первой задаче в лог записывается Site url for product id=X is site.ruПри последующих урл не выводит
UPD
В лог modx записывается следующая ошибка
[2018-09-12 20:49:18] (ERROR @ /var/www/site.ru/core/xpdo/xpdo.class.php: 1826) No foreign key definition for parentClass: msProduct using relation alias: Data
[2018-09-12 20:49:18] (ERROR @ /var/www/site.ru/core/xpdo/xpdo.class.php: 1289) Could not get table name for class: msProductData
UPD
Задача решена. Помогли на возмездной основе.
Если кто-то столкнется, решение следующее.
define('MODX_API_MODE', true);
require 'index.php';
require_once __DIR__ . '/gearman/QueyWorker.php';
try {
$worker = new QueyWorker();
$worker->addCallback('updatePrice', 'updatePrice_worker')->run();
} catch (Exception $e) {
ToLogValue($e->getMessage());
}
function updatePrice_worker($job) {
$workload = $job->workload();
$JSON_DATA = json_decode($workload, true);
ToLogValue("<h1>START UPDATE PRODUCT WITH ID {$JSON_DATA['ID']}</h1>");
FullUpdateItem($JSON_DATA['ID']);
return true;
}
function FullUpdateItem($id) {
global $modx;
$po = $modx->getObject('msProductOption', array('product_id' => $id, 'key' => 'site_url'));
ToLogValue("Site url for product id=".$id." is ".$po->value);
}
function ToLogValue($message) {
file_put_contents(__DIR__ . '/queue_update_log.html', $message . "\r\n", FILE_APPEND);
}
Т.е. во внутренней функции нужно было объявить глобальную переменную $modx