Загрузка моделей Yii вне рамок

Как я могу получить доступ к моделям Yii вне рамок?

У меня есть несколько рабочих-механиков, выполняющих задачи, и управление ими осуществляется с помощью BrianMoons GearmanManager. Я хотел бы иметь возможность получить доступ к нескольким моделям Yii в рабочем скрипте без необходимости загружать всю инфраструктуру Yii. Что мне нужно импортировать, чтобы загрузить модели в моем скрипте? (CActiverecord, DBconnection и т. Д.).

Рабочий выглядит так:

как простая функция

function reverse_string($job, &$log) {

$workload = $job->workload();

$result = strrev($workload);

$log[] = "Success";

return $result;

}

?>

или как класс:

<?php

class Sum {

private $cache = array();

private $foo = 0;

public function run($job, &$log) {

$workload = $job->workload();

if(empty($this->cache[$workload])){

$dat = json_decode($workload, true);

$sum = 0;

foreach($dat as $d){
$sum+=$d;
sleep(1);
}

$this->cache[$workload] = $sum + 0;

} else {

$sum = $this->cache[$workload] + 0;

}

$log[] = "Answer: ".$sum;

$this->foo = 1;

return $sum;

}

}

?>

Я хотел бы иметь возможность получить доступ к нескольким моделям и выполнять операции внутри рабочего следующим образом:

$foo=Foo::model()->findByPk($id);
$foo->attribute="bar";
$foo->save();

2

Решение

Чтобы иметь возможность использовать модели Yii, вам нужно создать консольную команду Yii и выполнить ее. В вашем случае это довольно просто:

Прежде всего, вам необходимо расширить класс GearmanWorker (доступно в Расширение PHP Gearman) и реализовать свой рабочий класс:

class SumWorker extends GearmanWorker {
// your real code here
public function doSomethingUseful( $job ) {
$workload = $job->workload();
echo "Job: " . $job->handle() . PHP_EOL;
$args = json_decode( $workload );

// actual code
}
}

затем создайте консольную команду Yii:

class SumCommand extends CConsoleCommand {
public function run($args) {
$worker = new SumWorker();

$worker->addServer();
$worker->addFunction("doSomethingUseful", array($worker, "doSomethingUseful"));

while (1) {
print "Waiting for job...\n";

$ret = $worker->work();

if ( $worker->returnCode() != GEARMAN_SUCCESS ) break;
}
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]