PHP使用implode处理数组后发送RabbitMQ消息出现空消息体问题
问题根因分析
- 变量作用域错误:
send_login_request.php中setMessage函数内的$data是局部变量,函数内部赋值不会修改函数外的全局$data变量,全局$data始终处于未赋值的空状态,最终传入AMQPMessage的内容为空。 - 代码执行顺序错误:
login.php中先执行require ('send_login_request.php'),此时send_login_request.php里的RabbitMQ消息发送逻辑会立刻执行,执行时还未调用setMessage赋值$data,后续调用setMessage也不会重新触发消息发送。 - 函数返回逻辑错误:
setMessage函数处理完$arr后没有将拼接好的$data返回,仅返回空值,即使调用函数也无法拿到处理后的内容。 - 类名拼写错误:构造消息时写的
AMQPMEssage拼写错误,正确应为AMQPMessage,该错误会导致代码运行异常。
修复方案
第一步:调整login.php的执行顺序
先处理POST参数构造数据,再引入发消息的文件:
<?php session_start(); include 'host_info.php'; if (isset($_POST['email']) && isset($_POST['password'])) { $email = $_POST['email']; $pass = $_POST['password']; $arr = array($email, $pass); // 先构造好数据再引入发消息的文件 require ('send_login_request.php'); } ?>
第二步:重构send_login_request.php的逻辑
移除冗余的函数封装,直接使用传入的$arr构造数据发送消息,同时修正拼写错误:
<?php require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPStreamConnection; use PhpAmqpLib\Message\AMQPMessage; include 'host_info.php'; $connection = new AMQPStreamConnection($address, 5672, $admin, $adminpass); $channel = $connection->channel(); $channel->queue_declare('login', false, false, false, false); // 直接使用login.php传入的$arr构造数据 $data = implode(',', $arr); echo $data; if (empty($data)) { echo 'Please input your email and/or password.'; // 空数据直接退出不发消息 exit; } // 修正类名拼写错误 $msg = new AMQPMessage($data, array('delivery_mode'=> AMQPMessage::DELIVERY_MODE_PERSISTENT)); $channel->basic_publish($msg,'', 'login'); $channel->close(); $connection->close(); ?>
如果要保留setMessage函数的封装,可以修改为如下写法:
// send_login_request.php 保留函数的版本 function setMessage($arr) { $data = implode(',', $arr); echo $data; if (empty($data)) { echo 'Please input your email and/or password.'; return null; } // 返回处理后的数据 return $data; } // 调用函数拿到有效数据后再发消息 $data = setMessage($arr); if ($data === null) { exit; } // 后续发消息逻辑和上面一致即可
内容的提问来源于stack exchange,提问作者Kube
相关产品推荐
相关产品推荐

