gpt4 book ai didi

php - PUSH/PULL 模式中的丢失消息(Ratchet + PHP + ZeroMQ 推送集成)

转载 作者:行者123 更新时间:2023-12-04 16:14:23 30 4
gpt4 key购买 nike

我正在我的网站上创建聊天、推送通知系统、用户事件小部件(即时更新)等。

我的网站是建立在 PHP 上的,所以我决定使用 Ratchet 作为我的任务的 websocket 服务器。我已经安装了所有必需的组件,并且我在 http://socketo.me/docs/push 上学习了指南并开始编码。

这是在 里面ChatMsg( $item ){...} 中的方法model.php 文件。它创建了一个 PUSH 套接字访问点原型(prototype)并在数据库中插入新项目后通过 ZeroMQ 将带有 JSON 数据的消息发送到服务器:

$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'my pusher');
$socket->connect("tcp://localhost:5555");
$socket->send(json_encode($sData));


接下来是我的 push-server.php ,仅创建一个 PULL 套接字访问点原型(prototype)并等待新消息,这些消息将传输到推送脚本,向客户端广播新通知、聊天消息和其他事件。

<?php 
require dirname(__DIR__) . '/vendor/autoload.php';

$loop = React\EventLoop\Factory::create();
$pusher = new MyApp\Pusher;

// Listen for the web server to make a ZeroMQ push after an ajax request
$context = new React\ZMQ\Context($loop);
$pull = $context->getSocket(ZMQ::SOCKET_PULL);
$pull->setSockOpt(ZMQ::SOCKOPT_HWM, 0);
$pull->bind('tcp://127.0.0.1:5555'); // Binding to 127.0.0.1 means the only client that can connect is itself
$pull->on('error', function ($e) {
$f = fopen('push-server-error.log', "a");
fwrite($f, $e->getMessage()."\n");
fclose($f);
});
$pull->on('message', array($pusher, 'onNewEvent'));

// Set up our WebSocket server for clients wanting real-time updates
$webSock = new React\Socket\Server($loop);
$webSock->listen(8081, '0.0.0.0'); // Binding to 0.0.0.0 means remotes can connect
$webServer = new Ratchet\Server\IoServer(
new Ratchet\Http\HttpServer(
new Ratchet\WebSocket\WsServer(
new Ratchet\Wamp\WampServer(
$pusher
)
)
),
$webSock
);

$loop->run();
?>


我成功启动了 push-server.php 使用监控工具 Supervisor,我为 WebSocket 流量设置了 NGINX 代理,设置客户端脚本(高速公路等)。

一般来说,我打算在生产中使用它。最初几个小时我在我的网站上修改了新的聊天系统,我对其进行了测试,并且一切正常。

但后来我遇到了这个问题。一些 ZeroMQ 消息(只是其中的一部分,可能是 5-10%)在通过 ZeroMQ 发送后丢失 PUSH socket 。那时,当从 开始发送大约 300-400 条消息时,就会出现此问题。 push-server.php 过程开始。

我深信这个问题在ZeroMQ内部(不在JS客户端或带有业务逻辑的Pusher脚本内部),因为我试图修改 中的“->on(){...}”方法push-server.php 以便在终端(控制台)上显示新消息,丢失的消息甚至不会显示在控制台上,即“ ->on(){...}”方法没有 catch 它们。

ZeroMQ " ->send() "方法总是在消息成功发送或丢失时返回一个空的 ZeroMQ 套接字对象。我只是通过在我的网站上发送聊天消息并获得回复(使用 AJAX 实现表单提交)来检查这一点:
var_dump($socket->send(json_encode($sData)));

可能有什么问题以及如何解决?
Server OS:      CentOS 6.9 (Final)
PHP version: 5.6.31
ZMQ extension version: 1.1.3
libzmq version: 4.2.2

最佳答案

我创建了 不持久 ZMQ::ContextZMQ::Socket我的问题解决了:

$context = new ZMQContext(1, false);
$socket = $context->getSocket(ZMQ::SOCKET_PUSH);

关于php - PUSH/PULL 模式中的丢失消息(Ratchet + PHP + ZeroMQ 推送集成),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46473208/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com