【发布时间】:2013-07-12 10:04:03
【问题描述】:
我希望使用 RabbitMQ 和名为 AMQP 的 PHP 的 PECL 扩展创建一个简单的任务队列。
我的目标很简单: 生产者应该将消息发送到包含需要处理的对象的信封的特定队列。
消费者都应该听取所述队列并在消息到来时对其进行处理。 我需要能够添加更多消费者并让 RabbitMq 以循环方式发送消息。
虽然很容易找到 Python 或 Java 库的教程,但我找不到 PHP 的 PECL 库的教程。
我不太确定是否应该绑定任何东西,我有一个使用自定义 php 库的工作示例,该库使用“basic_publish 和 basic_consume”,PECL 库中没有以这种方式实现。
所以这是我到目前为止得到的: 发布者:
$oConfig = Zend_Registry::get('config');
$sQueue = $oConfig->amqp->validate_queue_name;
$oConnection = new AMQPConnection();
$oConnection->setLogin($oConfig->amqp->login);
$oConnection->setPassword($oConfig->amqp->pass);
$oConnection->setVhost($oConfig->amqp->vhost);
$oConnection->setPort($oConfig->amqp->port);
$oConnection->connect();
$oChannel = new AMQPChannel($oConnection);
$oExchange = new AMQPExchange($oChannel);
$sMsg = new stdClass();
$sMsg->nId = $p_nId;
$sMsg->nStatus= $p_nStatus;
try {
$oChannel->startTransaction();
$bResponse = $oExchange->publish($sMgs,$sQueue);
if (!$bResponse) {
echo "<h1>An error occured, the message can't be published</h1>";
echo "<h3>Sorry i don't know why</h3>";
exit;
}
$oChannel->commitTransaction();
} catch (Exception $oException) {
echo "<h1>An error occured, the message can't be published</h1>";
echo "<h3>See error below</h3>";
echo "<pre>";
echo print_r($oException->getMessage());
echo "</pre>";
exit;
}
工人
$oConfig = Zend_Registry::get('config');
$oConnection = new AMQPConnection();
$oConnection->setLogin($oConfig->amqp->login);
$oConnection->setPassword($oConfig->amqp->pass);
$oConnection->setVhost($oConfig->amqp->vhost);
$oConnection->setPort($oConfig->amqp->port);
$oConnection->connect();
$oChannel = new AMQPChannel($oConnection);
$oQueue = new AMQPQueue($oChannel);
$oQueue->declare($oConfig->amqp->validate_queue_name);
function processMessage($oMessage, $oQueue) {
$nId = $msg->body->nId;
$nStatus = $msg->body->nStatus;
$oIniAct = $oActionMap->findBy('id',$nId);
$sReply = $oIniAct->updateStatusMisc($nStatus);
if ($sReply->status == $nStatus) {
$oQueue->ack($sMsg['delivery_tag']);
} else {
$oQueue->nack($sMsg['delivery_tag'],AMQP_REQUEUE);
}
}
$oQueue->consume("processMessage",AMQP_NOPARAM);
PHP 文档告诉我,consume() 会为每个人锁定相应的线程?所以基本上我一次只能有一名工作人员? 我还看到人们正在绑定队列,但是我看到的第一个具有基本消费的工人示例没有使用它。
如您所见,我很困惑,任何帮助/方向/教程 ASO...都会有所帮助
谢谢
【问题讨论】: