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