次のリンクで役立つコードを入手しました。
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. メッセージ:
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 キューを作成できます。私は何らかの説明を得るために一生懸命努力しています。
私にとって、コードのコピーと貼り付けは良いプログラミングではありません。自分が何をしているかを知ることは良いことです!
ありがとうございました!どんな助けでも大歓迎です!