使用PHP AMQP Lib和Docker两次发布RabbitMQ消息

ssgvzors  于 2022-10-23  发布在  PHP
关注(0)|答案(1)|浏览(200)

我已经使用Docker Compose设置了RabbitMQ的一个本地示例,并且正在查看RabbitMQ文档上的Hello world示例。下面是连接、创建队列并向其中推送消息的简单尝试:

<?php

require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

$rabbitMqHost = 'rabbitmq';

if (php_sapi_name() === 'cli') {
    $rabbitMqHost = '0.0.0.0';
}

$connection = new AMQPStreamConnection($rabbitMqHost, 5672, 'guest', 'guest');

$channel = $connection->channel();

$channel->queue_declare('hello', false, false, false, false);

$message = new AMQPMessage('Hello, world!' . microtime(true));

$channel->basic_publish($message, '', 'hello');

echo '[x] Sent \'Hello, world!\'';

$channel->close();
$connection->close();

exit;

这会很好地连接并在队列不存在时创建队列,并且当在命令行中运行此脚本时,会如预期的那样将1条消息添加到队列中。但是,如果我在浏览器中访问此脚本,则会向队列中添加2个新项。

Payload: Hello, world!1666282109.6845
Payload: Hello, world!1666282109.8559

我现在觉得这个问题是更上游的问题,可能更多地与我的Nginx设置有关,但我不确定是什么原因导致了这个问题,页面似乎没有执行任何重定向。
以下是我的docker-compose.yaml文件的内容:

version: "3.9"

services:
  nginx:
    build:
      context: ./nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ${PROJECTDIR}:/var/www/html
      - ./nginx/conf.d:/etc/nginx/conf.d
  php:
    build:
      context: ./php-fpm
    volumes:
      - ${PROJECTDIR}:/var/www/html
  database:
    image: mysql:5.7
    ports:
      - "3306:3306"
    restart: on-failure
    environment:
      MYSQL_DATABASE: dev
      MYSQL_USER: admin
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: docker
  rabbitmq:
    image: rabbitmq:3-management-alpine
    ports:
      - "5672:5672"
      - "15672:15672"
    volumes:
      - ./rabbitmq/data/:/var/lib/rabbitmq/
      - ./rabbitmq/log/:/var/log/rabbitmq

和My DockerFiles分别用于php-fpmnginx

FROM php:8.1-fpm

RUN mkdir -p /var/www/html

RUN docker-php-ext-install pdo pdo_mysql sockets
FROM nginx:1.23-alpine

CMD ["nginx", "-g", "daemon off;"]

EXPOSE 80 443

最后,我的nginx/conf.d/default.conf

server {
    listen 80;
    server_name _;
    root /var/www/html;
    index index.php index.html;
    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri = 404;
        fastcgi_split_path_info ^(.+`.php)(/.+)$;
        fastcgi_pass php:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

    error_log /var/log/nginx/error.log;
}

对于为什么在通过浏览器访问时总是将两条消息放入队列,我将非常感谢您的见解。
作为参考,环境配置也可以在GitHub repo on the rabbitmq branch中看到。

xxhby3vn

xxhby3vn1#

在浏览器中,选中“开发人员工具”、“网络”。您会发现您的浏览器正在进行两个查询,可能是“收藏夹图标”和索引页。
由于收藏夹图标不存在,所以您需要重定向到index.php--这将触发您看到的第二个兔子消息。
解决方案:添加一个收藏夹图标,重定向到另一个“丢失文件处理程序”或检查查询字符串。或者将测试文件重命名为“test.php”并从index.php中删除兔子代码。

相关问题