Macos PHP和AMQP RabbitMQ使用者
我有一个可以工作的PHP脚本,它将消息发布到RabbitMQ,并从制表符分隔的文本文件中解析出来。我将工作代码从该文件复制/粘贴到另一个文件中,并希望建立一个消费者,该消费者将检索发布到exchange的消息,对其进行json_解码并将其插入数据库 每次尝试,甚至复制/粘贴PHP.net站点中的示例代码,甚至SO中的示例,都会失败,出现空白白屏,并且没有错误消息,甚至会终止PHP fpm进程 知道队列为什么不绑定,这里出了什么问题吗?Macos PHP和AMQP RabbitMQ使用者,macos,rabbitmq,amqp,php,Macos,Rabbitmq,Amqp,Php,我有一个可以工作的PHP脚本,它将消息发布到RabbitMQ,并从制表符分隔的文本文件中解析出来。我将工作代码从该文件复制/粘贴到另一个文件中,并希望建立一个消费者,该消费者将检索发布到exchange的消息,对其进行json_解码并将其插入数据库 每次尝试,甚至复制/粘贴PHP.net站点中的示例代码,甚至SO中的示例,都会失败,出现空白白屏,并且没有错误消息,甚至会终止PHP fpm进程 知道队列为什么不绑定,这里出了什么问题吗? Nginx->php fpm PHP5.3.x MacBo
- Nginx->php fpm
- PHP5.3.x
- MacBookPro(OSX Lion)
- RabbitMQ(已安装librabbitmq和pecl amqp)
<?php
// Report all PHP errors
error_reporting(E_ALL);
/*****************************************
* MQ settings
****************************************/
$mq = array(
'host' => 'localhost',
'port' => 5672,
'login' => 'guest',
'password' => 'guest',
'exchange' => 'gbus.user',
'routing_key' => 'gbus.test.mike',
);
/*****************************************
* Connect to queue
****************************************/
$conn_args = array('host' => $mq['host'], 'port' => $mq['port'], 'login' => $mq['login'], 'password' => $mq['password']);
$conn = new AMQPConnection($conn_args);
$conn->connect();
$ch = new AMQPChannel($conn);
// Create a new queue
$q = new AMQPQueue($ch);
$q->declare('test-queue');
$q->bind($mq['exchange'],$mq['routing_key']);
?>
<br>
<font color="blue" face="arial" size="4">File Contents</font>
<hr>
<?php
while(true){
$msg=$q->get();
if ($msg['count']>-1){
echo "\n--------\n";
print_r($msg['msg']);
echo "\n--------\n";
}
sleep(1);
}
if (!$conn->disconnect()) {
throw new Exception('Could not disconnect');
}
?>
文件内容
下面是我用来发布到队列的示例,每次运行它时,我都会在RabbitMQ控制面板中查看20条新消息。我将测试限制为20行,但该文件有上万行 工作发布代码:
<?php
/*****************************************
* MQ settings
****************************************/
$mq = array(
'host' => 'localhost',
'port' => 5672,
'login' => 'guest',
'password' => 'guest',
'exchange' => 'gbus.user',
'routing_key' => 'gbus.test.mike',
);
/*****************************************
* Connect to queue
****************************************/
$conn_args = array('host' => $mq['host'], 'port' => $mq['port'], 'login' => $mq['login'], 'password' => $mq['password']);
$conn = new AMQPConnection($conn_args);
$conn->connect();
$ch = new AMQPChannel($conn);
$ex = new AMQPExchange($ch);
$ex->setName($mq['exchange']);
/*****************************************
* Parse the file
****************************************/
$filename = "/tmp/Users.txt";
$board = "test";
$fd = fopen ($filename, "r");
$contents = fread ($fd,filesize ($filename));
fclose ($fd);
$delimiter = "\r\n";
$rows = explode($delimiter, $contents);
$counter = 0;
?>
<br>
<font color="blue" face="arial" size="4">File Rows (first 20)</font>
<hr>
<?php
foreach ( $rows as $row )
{
$counter++;
echo "<b>Row $counter: </b> $row<br>";
// build list columns
list($login_name, $pwd, $account_type, $access_level, $status, $first_name, $last_name, $agent_code) = explode("\t", $row);
// build assoc array for json
$user = array("domain"=>$board, "username"=>$login_name, "user_id"=>$agent_code, "password"=>$pwd, "first_name"=>$first_name, "last_name"=>$last_name);
// Publish a message to the exchange with a routing key
$ex->publish(json_encode($user), $mq['routing_key'], AMQP_NOPARAM, array("content_type"=>"application/data"));
if($counter == 20) {
break;
}
}
$ch->close();
$conn->close();
?>
文件行(前20行)
您是否尝试过这里的示例:
您要查看的两个方面是:
emit_log.php
receive_logs.php
使用的库与PECL/内置库不同,我相信内置库不支持消费。我在这里尝试了所有示例并发布了作品,但消费失败:我还将原始队列与exchange解除绑定,以确保它没有“窃取”消息(不确定是否通过控制面板确认)。在RABBIMMQ文件夹的bin文件夹中,您有rabbitmqctl do
rabbitmqctl list_队列
来列出您的队列列表。交换将列出交换,列表绑定将为您提供有助于您的调试信息。查看更多详细信息。在这里发布转储,这将有助于发现问题所在。通过删除队列绑定调用,我可以让它进行声明,但随后服务器再次崩溃。任何时候我包括bind,它都会失败。不确定是否只是MacOSX的问题;还没有在linux box上试用过。奇怪的一点。php.net上的AMQP文档已经过时(基本上没有更新),比如$queue->declare已经折旧,但仍然存在于文档中。因此,从中学习时要小心。如果您使用的是rabbitMQ,那么您可以使用“videlavaro/php amqplib”工作队列,这正是我试图通过php、Pear等示例实现的。您提供的链接没有提供PHP示例,而是指向Rabbit网站上队列的Python示例。我发布的链接明确地为我显示了PHP示例,我最近使用过它们,它们的工作效率达到了预期的100%。顺便说一句,我也在使用自制的Mac OSX Lion box上运行。按照链接,然后鼠标移到下面的“代码”部分,它们都是python链接。但我明白你的意思。我会检查并报告。我想使用PHP.net中记录的AMQP lib,因此必须了解它们需要什么。这意味着这些示例是RabbitMQ网站上官方教程的PHP版本-检查git hub文件的代码,它们都是PHP!