- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用 websockets 将一些数据从 php 应用程序发送到用户的浏览器。因此我决定使用 Swoole结合 RabbitMQ。
这是我第一次使用 websockets,在阅读了一些关于 Socket.IO、Ratchet 等的帖子后,我决定停止使用 Swoole,因为它是用 C 语言编写的,并且可以方便地与 php 一起使用。
这就是我对使用 websockets 启用数据传输的想法的理解:1) CLI启动RabbitMQ worker和Swoole server2)php应用向RabbitMQ发送数据3) RabbitMQ 向 worker 发送带有数据的消息4) Worker 收到带有数据的消息+ 与Swoole socket 服务器建立socket 连接。5)Swoole服务器向所有连接广播数据
问题是如何绑定(bind)Swoole socket server和RabbitMQ?或者如何让RabbitMQ与Swoole建立连接并向其发送数据?
代码如下:
Swoole服务器(swoole_sever.php)
$server = new \swoole_websocket_server("0.0.0.0", 2345, SWOOLE_BASE);
$server->on('open', function(\Swoole\Websocket\Server $server, $req)
{
echo "connection open: {$req->fd}\n";
});
$server->on('message', function($server, \Swoole\Websocket\Frame $frame)
{
echo "received message: {$frame->data}\n";
$server->push($frame->fd, json_encode(["hello", "world"]));
});
$server->on('close', function($server, $fd)
{
echo "connection close: {$fd}\n";
});
$server->start();
Worker 从 RabbitMQ 接收消息,然后连接到 Swoole 并通过套接字连接(worker.php)广播消息
$connection = new AMQPStreamConnection('0.0.0.0', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('task_queue', false, true, false, false);
echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";
$callback = function($msg){
echo " [x] Received ", $msg->body, "\n";
sleep(substr_count($msg->body, '.'));
echo " [x] Done", "\n";
$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
// Here I'm trying to make connection to Swoole server and sernd data
$cli = new \swoole_http_client('0.0.0.0', 2345);
$cli->on('message', function ($_cli, $frame) {
var_dump($frame);
});
$cli->upgrade('/', function($cli)
{
$cli->push('This is the message to send to Swoole server');
$cli->close();
});
};
$channel->basic_qos(null, 1, null);
$channel->basic_consume('task_queue', '', false, false, false, false, $callback);
while(count($channel->callbacks)) {
$channel->wait();
}
$channel->close();
$connection->close();
将消息发送到 RabbitMQ (new_task.php) 的新任务:
$connection = new AMQPStreamConnection('0.0.0.0', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('task_queue', false, true, false, false);
$data = implode(' ', array_slice($argv, 1));
if(empty($data)) $data = "Hello World!";
$msg = new AMQPMessage($data,
array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT)
);
$channel->basic_publish($msg, '', 'task_queue');
echo " [x] Sent ", $data, "\n";
$channel->close();
$connection->close();
启动 swoole server 和 worker 后,我从命令行触发 new_task.php:
php new_task.php
在运行 RabbitMQ Worker 的命令行提示符 (worker.php) 中,我可以看到一条消息已传递给该 worker(“[x] Received Hello World!” 消息正在出现)。
但是在运行 Swoole 服务器的命令行提示符下什么也没有发生。
所以问题是:1)这种做法的思路对吗?2) 我做错了什么?
最佳答案
在收到消息时触发的回调(在 worker.php
中)中,您使用的是仅异步的 swoole_http_client
。这似乎导致代码永远不会被完全执行,因为回调函数在触发异步代码之前返回。
做同样事情的同步方法将解决问题。这是一个简单的例子:
$client = new WebSocketClient('0.0.0.0', 2345);
$client->connect();
$client->send('This is the message to send to Swoole server');
$recv = $client->recv();
print_r($recv);
$client->close();
在 github 查看 WebSocketClient
类和示例用法.
您也可以将其包装在 coroutine 中,像这样:
go(function () {
$client = new WebSocketClient('0.0.0.0', 2345);
$client->connect();
$client->send('This is the message to send to Swoole server');
$recv = $client->recv();
print_r($recv);
$client->close();
});
关于php - 使用 RabbitMQ 的 Swoole,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49226659/
我的问题就是如何在 中安装 Swoole Ubuntu 14.04 LTS 我试过了 sudo pecl install swoole 我收到了一些错误,已经发布 here 有没有其他方法可以安装相同
引入背景:假如我们每天有10000个订单生成,需要同步到仓储系统中去,以前做法是开启一个crontab去跑这些任务,但是发现总有感觉同步效率低,间隔时间都是分钟级别的。 解决方案测试:我们将同步订
本文实例讲述了php基于 swoole 实现的异步处理任务功能。分享给大家供大家参考,具体如下: 安装swoole: 下载官方swoole压缩包,解压进入目录
本文实例讲述了PHP+swoole+linux实现系统监控和性能优化操作。分享给大家供大家参考,具体如下: 服务器监控 端口监控php运行shell脚本 ?
随着微信的普及,扫码登录方式越来越被现在的应用所使用。它因为不用去记住密码,只要有微信号即可方便快捷登录。微信的开放平台原生就有支持扫码登录的功能,不过大部分人还是在用公众平台,所以扫码登录只能自行
我正在设置 Swoole我在 CentOS 7 主机上的聊天应用程序的 web 套接字服务器。并将使用 Swoole 表来存储用户列表。 但我不确定 Swoole table 的使用生命周期是多少。当
Async Mysql Client of Swoole在我尝试使用 Swoole MySQL Class 的 PHP 项目中PHP 但我得到了 class not found 执行代码时出错。 下面
前言 在之前的版本中,编写Cli命令行脚本中使用异步或协程功能时,Swoole会自动在脚本末尾检测是否有Event::wait()调用,如果没有,底层会自动调用register_shutdown_
我需要根据进程请求动态加载不同的 ssl 证书。我尝试像下面的代码那样做,但服务器仍在处理请求时加载 cert1 证书,而不是我在代码中尝试做的 cert2。 如何即时动态地重新加载不同的证书?可能吗
我试图通过 pecl 安装 swoole(一个 php 插件)并从源代码手动构建。两种方法都因错误而失败 /usr/include/php/ext/pcre/php_pcre.h:37: error:
我正在尝试使用 websockets 将一些数据从 php 应用程序发送到用户的浏览器。因此我决定使用 Swoole结合 RabbitMQ。 这是我第一次使用 websockets,在阅读了一些关于
windows 下安装 swoole 具体步骤: swoole,原本不支持在windows下安装的,所以我们要安装cygwin来使用。在安装cygwin下遇到了很多坑,百度经验上的文档不是很全,所
操作系统:阿里云esc实例centos7.4 软件:docker-ce version 18.09.3, docker-compose version 1.23.2 一.创建带有swoole-r
前言 Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。使用 PHP + Swoole 作为网络通信框架,可以使企业 IT 研发团
例如这个代码 on("start", function (Swoole\Http\Server $server) { echo "Swoole http server is started a
swoole-1.7.22 版本已发布,此版本是一个BUG修复版本,专门针对PHP7做了大量修改,可完美运行于PHP7环境。 更新内容如下: 修复PHP7下HttpServer发生内存泄漏的问题
您好,我在启用 https 时遇到问题在 羊毛 与 laravel api当我尝试通过 发送 api 请求时http 它运作良好,但我无法通过https : curl http://127.0.0.1
有没有人设法将 Blackfire 与 Swoole 一起使用?我已经尝试设置了几天,但没有成功。 我在 PHP-CLI Swoole Dockerfile 中调用以下脚本: #!/usr/bin/e
我是一名优秀的程序员,十分优秀!