3

我想知道...如何从 php 将文件发送到 rabbitmq 队列。我经历了很多例子,其中大多数都没有用。下面是一个即将工作的消费者生产者示例。下面是一个publisher.php

<?php
  require_once('../php-amqplib/amqp.inc');
    include('../config.php');
    $conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);
    $channel = $conn->channel();
    $channel->exchange_declare('upload-pictures','direct', false, true, false);
    $metadata = json_encode(array(
    'image_id' => $argv[1],
    'user_id' => $argv[2],
    'image_path' => $argv[3]
    ));
    $msg = new AMQPMessage($metadata, array('content_type' => 'text/plain','delivery_mode'    => 2));
    $channel->basic_publish($msg, 'upload-pictures');
    $channel->close();
    $conn->close();
    ?>

消费者.php

<?php
require_once('../php-amqplib/amqp.inc');
include('../config.php');
$conn = new AMQPConnection(HOST, PORT, USER, PASS,VHOST);
$channel = $conn->channel();
$queue = 'add-points';
$consumer_tag = 'consumer';
$channel->exchange_declare('upload-pictures','direct', false, true, false);
$channel->queue_declare('add-points',false, true, false, false);
$channel->queue_bind('add-points', 'upload-pictures');
$consumer = function($msg){};
$channel->basic_consume($queue,$consumer_tag,false,false,false,false,$consumer);
?>

根据rabbitmq手册中提供的示例,我需要先在一个终端中运行消费者(php consumer.php),然后在另一个终端中运行发布者(php publisher.php 1 2 file/path.png),我会得到一个“向用户添加积分:消费者终端中的 2" 消息。我根本没有收到此消息。你能建议我哪里出错了吗

4

1 回答 1

5

重要通知:

AMQP 协议不是针对大型内容传输(但它可以完成这样的工作,我尝试了高达 128Mb 的测试)。我建议您在消息中发送文件路径并在工作人员中处理它,而不是发送整个文件,同时存储大消息会非常快地消耗内存,当超过磁盘时将使用磁盘,这与 RAM 相比非常慢。


无论如何,如果您仍想发送文件:

您必须将文件内容作为常规消息正文发送。如果它是二进制文件,则使用 base64 或您想要的任何内容对其进行编码。没有其他方法可以做你想做的事。在您的代码中,我没有看到您正在读取文件。

于 2013-07-01T14:40:43.007 回答