1

私は ZEND を初めて使用し、バージョン (ZEND 1.11.1) に取り組んでいます。ZEND アプリケーションに ZEND_QUEUE を実装しようとしていますが、適切なチュートリアルがありません。私はキューを実装しようとしています。

DB用のキューを開発しています。アプリケーションは次の流れのように動作します。 1. ユーザーはアプリケーションを介して SQL クエリを入力し、結果を待ちます。2. クエリが正常に完了すると、クエリは QUEUE に移動され、データベースで処理されます。クエリは、送信された結果をユーザーに送信する必要があります。

私のコントローラーの内部:

class IndexController extends Zend_Controller_Action
{
  public function indexAction()
  {
   $options = array(
        'name'          => 'queue1',
        'driverOptions' => array(
        'host'      => '127.0.0.1',
        'port'      => '3306',
        'username'  => 'queue',
        'password'  => 'queue',
        'dbname'    => 'queue',
        'type'      => 'pdo_mysql'
             )
        );

        // Create a database queue.
        // Zend_Queue will prepend Zend_Queue_Adapter_ to 'Db' for the class name.
        $queue = new Zend_Queue('Db', $options);
        foreach ($queue->getQueues() as $name) {
          echo $name, "\n";
        }
       $queue->send('My Test Message');
     }
}

私が直面している問題は、コードを追加するフォルダーを理解できないことです。

アプリケーションの要件は CONTROLLER と VIEW のみを使用することであるため、アプリケーションで MODEL を使用していません。

また、Zend_Queue_Adapter_Db を拡張しようとすると、次のエラーが発生します。

致命的なエラー: クラス 'ZendJobQueue' が見つかりません

また

致命的なエラー: F:\wamp\www\helloworld\library\Zend\Controller\Dispatcher\Standard.php:242 でメッセージ「無効なコントローラーが指定されました (エラー)」を含む例外「Zend_Controller_Dispatcher_Exception」がキャッチされませんでした: 242 スタック トレース: #0 F:\wamp \www\helloworld\library\Zend\Controller\Front.php(946):

初心者が ZEND JOBQUEUE を操作するのに役立つ正しいフォルダーまたはチュートリアルについて、親切にアドバイスしてください。

4

1 に答える 1

1

次のリンクで役立つコードを入手しました。

http://dennisgurnick.com/2011/09/29/zend-queue-with-mysql/

そして、私はウェブサイトが指示したのとまったく同じことをしました:

; file: application/configs/application.ini

[production]
; ...
resources.frontController.params.displayExceptions = 0
; ...
queue.driverOptions.type = "pdo_mysql"
queue.driverOptions.host = "localhost"
queue.driverOptions.username = "howtoqueue"
queue.driverOptions.password = "howtoqueue"
queue.driverOptions.dbname = "howtoqueue"

Boostrap.php ファイルに次のコードを追加しました。

<?php

// file: application/Bootstrap.php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
  protected function _initQueue()
  {
    $options = $this->getOptions();

    $queueAdapter = new Zend_Queue_Adapter_Db( $options[ 'queue' ] );
    Zend_Registry::getInstance()->queueAdapter = $queueAdapter;

  }

}

また、Library フォルダー内にもう 1 つのファイルを追加しましたが、このファイルが追加された理由がわかりません。

<?php

// file: library/EmailPopo.php

class EmailPopo
{
  private $_data = array();

  public function __get($key) {
    return $this->_data[$key];
  }

  public function __set($key, $value) {
    $this->_data[$key] = $value;
  }

}

以下のコードを IndexController に追加しました。

// file: application/controllers/IndexController.php

require_once "EmailPopo.php";
public function indexAction()
{
  $queueAdapter = Zend_Registry::getInstance()->queueAdapter;

  $options = array( 'name' => 'emailqueue' );
  $queue = new Zend_Queue( $queueAdapter, $options );

  $email = new EmailPopo();
  $email->date = time();
  $email->from = "minnie.mouse@disney.com";
  $email->to = "mickey.mouse@disney.com";
  $email->subject = "I want a divorce";
  $email->body = "Letter's in the mail.";

  $message = base64_encode( gzcompress( serialize( $email ) ) );

  $queue->send( $message );

}
public function queueAction() {

  $queueAdapter = Zend_Registry::getInstance()->queueAdapter;

  $options = array( 'name' => 'emailqueue' );
  $queue = new Zend_Queue( $queueAdapter, $options );

  $messages = $queue->receive( 2 );
  foreach( $messages as $message ) {
    try {
      $email = unserialize( gzuncompress( base64_decode( $message->body ) ) );
      $queue->deleteMessage( $message );

      echo sprintf(
        "Sent email to %s (time: %s)<br/>",
        $email->to,
        new Zend_Date( $email->date )
        ); 

    } catch( Exception $ex ) {
      echo "Kaboom!: " . $ex->getMessage() . "<br/>";   
    }
  }
  die( "Done" );
}

率直に言って、die('Done'); でコード化された O/P として「DONE」を受け取っているため、このコードは実行されているようです。

最初にコードを実行すると、次の出力を受け取りました。

Sent email to minnie.mouse@disney.com (time: current time)<br/>
Done

同じファイルを再度実行すると、出力されます

Done

一人で、私は混乱していますが、なぜそれが異なるインスタンスで異なる出力を出すのか混乱しています. 数時間後にコードを再度実行すると、最初の O/P が表示されます。

データベースの変更:

このアプリケーションには、次の 2 つのテーブルがあります。

  1. メッセージ

1. メッセージ:

CREATE TABLE IF NOT EXISTS `message` (
  `message_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `queue_id` int(10) unsigned NOT NULL,
  `handle` char(32) DEFAULT NULL,
  `body` varchar(8192) NOT NULL,
  `md5` char(32) NOT NULL,
  `timeout` decimal(14,4) unsigned DEFAULT NULL,
  `created` int(10) unsigned NOT NULL,
  PRIMARY KEY (`message_id`),
  UNIQUE KEY `message_handle` (`handle`),
  KEY `message_queueid` (`queue_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;

ALTER TABLE `message`
  ADD CONSTRAINT `message_ibfk_1` FOREIGN KEY (`queue_id`) REFERENCES `queue` (`queue_id`) ON DELETE CASCADE ON UPDATE CASCADE;

2.キュー

CREATE TABLE IF NOT EXISTS `queue` (
  `queue_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `queue_name` varchar(100) NOT NULL,
  `timeout` smallint(5) unsigned NOT NULL DEFAULT '30',
  PRIMARY KEY (`queue_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;

上記の2つはDB構造です。キュー テーブルにいくつかのデータが挿入されているのを確認できますが、どれが影響を受けているのかわかりません。

キューとスクリプトの構造を理解するのを手伝ってください。

うまくいっていますか?上記のロジックを理解してうまくいけば、Zend でクエリ実行用の DB キューを作成できます。私は何らかの説明を得るために一生懸命努力しています。

私にとって、コードのコピーと貼り付けは良いプログラミングではありません。自分が何をしているかを知ることは良いことです!

ありがとうございました!どんな助けでも大歓迎です!

于 2013-04-16T10:01:06.033 に答える