在框架外加载Yii模型


Loading Yii models outside of framework

如何访问框架之外的Yii模型?

我有一些齿轮工在执行任务,并使用BrianMoons齿轮工管理器进行管理。我希望能够访问工人脚本中的一些Yii模型,而不必加载整个Yii框架。我需要导入什么才能加载脚本中的模型?(C激活线、数据库连接等)。

一个工人长这样:

作为简单函数

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扩展中可用)并实现您的worker类:

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;
        }
     }
 }