gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:21:55 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com