3

私は、Phirehoseを使用してTwitterStreamingAPIを収集して使用するプロジェクトに取り組んでいます。Phirehoseライブラリは、コマンドラインから、できればデーモンまたはcronジョブとして実行するように設計されています。

デーモンを作成し、ライブラリフォルダーに配置しました。Bootstrap.phpが更新され、カスタムライブラリが自動ロードされるようになりました。したがって、アプリケーション自体は私のデーモンを見るのに問題はありません。

私の問題は、それをZendFrameworkと適切に統合する方法です。コマンドラインから、またはUpstartなどのツールを使用してデーモンファイルを直接呼び出すことができる必要がありますが、そうすると、Zendアプリケーションがロードされないため、モデルにアクセスできなくなります。

コントローラを作成して起動することもできますが、誰かがWebインターフェイスからデーモンを制御できるというセキュリティの問題を追加したくありません。データベースに手動で接続するためにPDOを作成することもできますが、スケーリングの理由からそれを避けようとしています。すべてのデータベース接続データがapplication.iniにあることを望みます。

デーモンクラス内で、モデルを使用できるようにZend Frameworkアプリケーションを初期化する方法はありますか?

4

1 に答える 1

4

この例では、Zend_Queue を使用してバックグラウンド タスクを実行する方法を示します。この特定の例では、Zend_Queue と cronjob を使用してバックグラウンドで請求書を生成しています。Zend_Queue は初期化され、ブートストラップに登録されています。

ジョブの作成、My_Job ソースは次のとおりです。

class My_Job_SendInvoice extends My_Job
{
    protected $_invoiceId = null;

    public function __construct(Zend_Queue $queue, array $options = null)
    {
        if (is_array($options)) {
            $this->setOptions($options);
        }

        parent::__construct($queue);
    }

    public function job()
    {
        $filename = InvoiceTable::getInstance()
            ->generateInvoice($this->_invoiceId);

        return is_file($filename);
    }
}

サービスまたはモデル内のどこかで、ジョブを登録します。

$backgroundJob = new My_Job_SendInvoice(Zend_Registry::get('queue'), array(
    'invoiceId' => $invoiceId
));
$backgroundJob->execute();

バックグラウンド スクリプトの作成:

defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/..'));

// temp, environment should be specified prior execution
define('APPLICATION_ENV', 'development');

set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));


require_once 'Zend/Application.php';

$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);

$application->bootstrap();

/* @var $queue Zend_Queue */
$queue    = Zend_Registry::get('queue');
$messages = $queue->receive(5);

foreach ($messages as $i => $message) {
    /* @var $job My_Job */
    $job = unserialize($message->body);
    if ($job->job()) {
        $queue->deleteMessage($message);
    }
}
于 2012-06-09T04:08:04.530 に答える