【问题标题】:Asynchronous consumption of queue to respond to frontend Requests异步消费队列响应前端请求
【发布时间】:2022-02-08 20:44:22
【问题描述】:

在我第一次尝试了解 php 中微服务的异步消息传递时。 我构建了一个注册表单,使用 Ajax 将数据发送到 php 脚本,该脚本将消息发布到保存队列,然后启动 while 循环以使用前端队列,该队列应该将响应作为 echo 发送回 ajax .

问题: 在 ajax 调用的同一脚本中启动消费者似乎是阻塞的,这意味着如果save 服务端发生任何事情,我的服务器很忙,我什至不能^C 它,我必须杀死手动终端!

我该怎么办?

我的 Ajax 调用:

$(document).ready(function () {
  $("form").submit(function (event) {
    var formData = {
      name: $("#fullname").val(),
      email: $("#email").val(),
      password: $("#password").val()
    };
  
    $.ajax({
      type: "POST",
      url: "index.php",
      data: { 'data' : JSON.stringify(formData) },
      dataType: "json",
      encode: true,
      success : function(d){
        console.log(d)
      },
      error : function(e){
        
        console.log('error', typeof this.data)
      }
    })
  
      event.preventDefault();
    });
  });

我的 index.php:

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

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

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

session_start();
$corr_id = uniqid();
$_SESSION['user'] = $corr_id;

error_log($_SESSION['user']);
error_log(session_id());
$channel->exchange_declare('Planning', 'topic', false, true, false, false, false);
$channel->queue_declare('front_queue', false, true, false, false);
$channel->queue_bind('front_queue', 'Planning', $corr_id);

$payload = json_decode($_POST['data'], true);
$payload += ["id" => $corr_id];
error_log(json_encode($payload));

$con =   new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$chan = $con->channel();
$chan->exchange_declare('Planning', 'topic', false, true, false);
$new_msg = new AMQPMessage(json_encode($payload), array('correlation_id' => $corr_id));
$chan->basic_publish($new_msg, 'Planning', 'save');
$chan->close();
$con->close();
$callback = function($msg)
{
    $channel = $msg->getChannel();
    $connection = $msg->getChannel()->getConnection();
    echo json_encode($msg->body);
    $msg->ack();
    $channel->close();
    $connection->close();
};
$channel->basic_consume('front_queue', '', false, false, false, false, $callback);

while($channel->is_open()){
    $channel->wait();
}

【问题讨论】:

  • 我很困惑你所说的“我的服务器很忙,我什至不能 ^C 它”的意思——通常,Web 服务器会运行一些专用软件,如 Apache 或 Nginx,它负责处理并发请求。您是否尝试使用 PHP 的开发模式服务器 (php -S) 运行它?
  • 是的,我发现这是一个很大的错误,我尝试了 Apache 和 Nginx,他们解决了问题

标签: php ajax rabbitmq php-amqplib


【解决方案1】:

使用 PHP 服务器来测试这个应用程序是一个非常糟糕的主意, 使用 Nginx 或 apache 解决了问题

【讨论】:

    猜你喜欢
    • 2016-05-09
    • 2023-03-07
    • 2017-11-23
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    相关资源
    最近更新 更多