2

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

我有一些齿轮工执行任务,并使用 BrianMoons GearmanManager 进行管理。我希望能够在 worker 脚本中访问一些 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();
4

1 回答 1

0

为了能够使用 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;
        }
     }
 }
于 2014-10-31T09:37:03.243 回答