通过php每秒从队列接收数据的最佳做法是什么?我使用ajax查询执行此操作,每秒调用php脚本。在那里,创建了一个连接对象,每次都声明一个队列。我试图在会话变量中第一次保存它,但是当我第二次调用PHP脚本时,我无法再接收任何数据。当我调试通道对象时,我看到is_open为false:
protected' is_open' => boolean false
这是我的基本php测试代码:
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
session_start(); # start session handling.
$id = $_GET["uid"];
$connected = $_GET["connected"];
if (empty($id)) {
$id = 0;
}
$queue = 'CyOS EV Queue ' . $id;
$reset = $_GET["reset"];
if ($reset === "true") {
session_destroy();
$_SESSION = array();
echo "session destroyed";
var_dump($_SESSION);
exit;
}
$connection;
$channel;
if (!isset($_SESSION['coneccted'])) {
$_SESSION['coneccted'] = true;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare($queue, false, false, false, false, false);
$channel->queue_bind($queue, 'CyOS-EX');
$_SESSION['connection'] = $connection;
$_SESSION['channel'] = $channel;
} else {
echo "already connected \n\r";
$connection = $_SESSION['connection'];
$channel = $_SESSION['channel'];
var_dump($_SESSION);
}
$test = new AMQPMessage();
while ($i < 10) {
echo "try to get data from " . $queue . "\n\r";
$test = $channel->basic_get($queue, true);
$i++;
if (isset($test)) {
echo "received data";
break;
}
}
echo $test->body;
每当我调用脚本时,当我初始化连接和通道时,它就会起作用。
答案 0 :(得分:1)
我认为你关注的是这些:
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare($queue, false, false, false, false, false);
$channel->queue_bind($queue, 'CyOS-EX');
让我们看看这里发生了什么:
避免重新连接的常规方法(步骤1和2)是让消费者在后台运行,例如使用supervisord启动命令行PHP脚本,该脚本在进入时连续运行处理消息。但是,如果您需要在队列中出现数据后将数据恢复到浏览器,那么这将无法工作。< / p>
每次轮询和创建新PHP流程的常用替代方法包括:
正如我所说,这些并非特定于RabbitMQ,但适用于您在数据库,文件,远程服务等等等待事情的任何时候。