Как я могу получить доступ к моделям 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();
Чтобы иметь возможность использовать модели 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;
}
}
}
Других решений пока нет …