Php 如何从AMQP(RabbitMQ)队列中删除消息?

Php 如何从AMQP(RabbitMQ)队列中删除消息?,php,queue,rabbitmq,amqp,mail-server,Php,Queue,Rabbitmq,Amqp,Mail Server,这就是问题所在 我正在使用PHP AMQP从Rabbitmq读取结果队列,以便处理发送的每封电子邮件上的重要信息。完成此操作后,我需要将该消息删除或标记为已写入,以便下次读取队列时不会得到已处理的消息 由于Rabbitmq服务器每小时发送超过10000封电子邮件,因此每次我读取队列以处理结果发送时,脚本至少可以运行5分钟,以便处理队列中的所有消息,因此在完成后,在这5分钟内,会有数百条新消息被放置。这使得我无法在脚本完成后清除队列,因为它将删除脚本运行期间未处理的消息位置 这让我只有一个选择。在

这就是问题所在

我正在使用PHP AMQP从Rabbitmq读取结果队列,以便处理发送的每封电子邮件上的重要信息。完成此操作后,我需要将该消息删除或标记为已写入,以便下次读取队列时不会得到已处理的消息

由于Rabbitmq服务器每小时发送超过10000封电子邮件,因此每次我读取队列以处理结果发送时,脚本至少可以运行5分钟,以便处理队列中的所有消息,因此在完成后,在这5分钟内,会有数百条新消息被放置。这使得我无法在脚本完成后清除队列,因为它将删除脚本运行期间未处理的消息位置

这让我只有一个选择。在我的AMQP脚本处理或读取消息后立即标记或删除消息

有办法吗?(这是剧本)


成功处理后确认消息
$queue->ack()
,甚至使用
AMQP\u AUTOACK
标志消费/获取消息

UPD:

根据您的代码:

1.应答信息
while ($envelope = $queue->get()) {
    //Function that processes the message
    process_message($envelope->getBody());
    $queue->ack($envelope->getDeliveryTag());
}
2.使用
AMQP\u AUTOACK
标志获取它:
while ($envelope = $queue->get(AMQP_AUTOACK)) {
    //Function that processes the message
    process_message($envelope->getBody());
}
p.S.:

查看文档,看起来更适合这里

3.处理后,您可以使用和确认消息:
$queue->consume(function ($envelope, $queue) {
        process_message($envelope->getBody());
        $queue->ack($envelope->getDeliveryTag());
});
4.或者使用
AMQP\u AUTOACK
标志消费,但当处理失败时,您将无法再次处理消息:
$queue->consume(function ($envelope, $queue) {
        process_message($envelope->getBody());
        $queue->ack($envelope->getDeliveryTag());
}, AMQP_AUTOACK);

结论:我建议使用#3解决方案,但这取决于您。

用代码更新了我的答案。我相信你已经读过了,但以防万一,这里是官方文件,它在某些部分有点过时,但仍然很好地理解如何使用PHPAMQP,并且有一些你可能会发现有用的例子p.s。举个例子,我正在使用的完美ZAQ#2工作得很好。谢谢
$queue->consume(function ($envelope, $queue) {
        process_message($envelope->getBody());
        $queue->ack($envelope->getDeliveryTag());
}, AMQP_AUTOACK);