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

标签 php docker docker-compose rabbitmq php-amqplib

我已经使用 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

我的 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中看到.

最佳答案

在浏览器中,选中“开发者工具”、“网络”。您会发现您的浏览器正在发出两个查询,可能是“favicon”和索引页面。

由于 favicon 不存在,您将重定向到 index.php - 这将触发您看到的第二条兔子消息。

解决方案:添加一个图标,重定向到另一个“丢失的文件处理程序”或检查查询字符串。或者将测试文件重命名为“test.php”并从 index.php 中删除 rabbit 代码。

关于php - 使用 PHP AMQP Lib 和 Docker 发布两次 RabbitMQ 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74132546/

相关文章:

php - Docker、PHP PDO 和单个 MySQL 容器(无法通过容器名称连接)

networking - docker-compose 网络创建将我踢出了 ssh

php - 所有数据都不是从mysql中的某个字段检索的

php - 分页 - 检查是否存在下一个/上一个记录

Docker 构建失败(rpc 错误 : code = 2 desc = "oci runtime error: exec format error")

docker - 从主机通过主机名访问容器

php通过字符串调用标准函数

javascript - PHP 未定义偏移量 2

docker - 从特权容器输入主机命名空间

python-3.x - 在dockerfile中缓存PIP包