[РЕШЕНО] Использование modx в фоновом скрипте

Пытаюсь сделать обновление опций товаров в minishop2 в фоновом режиме.
Для этого использую gearman
Написал скрипт, который должен обрабатывать очереди. В нем я инициализирую 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
Алексей П
12 сентября 2018, 14:12
modx.pro
1 250
0

Комментарии: 0

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0