php - zeromq - 总是丢失第一条消息

标签 php zeromq

我一直在尝试在我的本地计算机和远程服务器之间使用 zeromq 设置一个简单的“管道”。 我在本地计算机上测试了脚本并且它运行良好,但是当我尝试使用远程计算机作为结束时(带有 SOCKET_PULL 的计算机),我开始遇到问题。任何进程发送的第一条消息总是丢失。

代码很简单,

推送(sender.php):

<?php
//Use the specified port or 5555 for sending jobs
$port = $_SERVER['argc'] > 1 ? $_SERVER['argv'][1] : '5555';
$jobN = $_SERVER['argc'] > 2 ? $_SERVER['argv'][2] : '';


$context = new ZMQContext();

//  Socket to send messages on
$sender = new ZMQSocket($context, ZMQ::SOCKET_PUSH);

//If I want to connect to the server I use this line
$sender->connect("tcp://my-server-address.com:$port");

//If I want to connect to localhost I use this line
//$sender->connect("tcp://localhost:$port");

$sender->send('job-1' . ($jobN ? " $jobN" : ''));
$sender->send('job-2' . ($jobN ? " $jobN" : ''));
$sender->send('job-3' . ($jobN ? " $jobN" : ''));
$sender->send('job-4' . ($jobN ? " $jobN" : ''));
$sender->send('job-5' . ($jobN ? " $jobN" : ''));
$sender->send('job-6' . ($jobN ? " $jobN" : ''));
$sender->send('job-7' . ($jobN ? " $jobN" : ''));
$sender->send('job-8' . ($jobN ? " $jobN" : ''));
$sender->send('job-9' . ($jobN ? " $jobN" : ''));
$sender->send('job-10' . ($jobN ? " $jobN" : ''));
echo 'done';

接收者(worker.php)

<?php
//Use the specified port or 5556 for getting finished jobs
$port = $_SERVER['argc'] > 1 ? $_SERVER['argv'][1] : '5555';

//  Prepare our context and socket
$context = new ZMQContext();
$receiver = new ZMQSocket($context, ZMQ::SOCKET_PULL);
$receiver->bind("tcp://*:$port");

$count = 1;
while(true) {
    $string = $receiver->recv();
    echo "Received $string $count\n";
    $count += 1;
}

如果我在本地运行代码(在一个终端中运行“php worker.php”,在另一个终端中运行“php sender.php”)。

我明白了

Received job-1 1
Received job-2 2
Received job-3 3
Received job-4 4
Received job-5 5
Received job-6 6
Received job-7 7
Received job-8 8
Received job-9 9
Received job-10 10

但是如果我使用远程(发送者在本地,接收者在远程),我会得到

Received job-2 1
Received job-3 2
Received job-4 3
Received job-5 4
Received job-6 5
Received job-7 6
Received job-8 7
Received job-9 8
Received job-10 9

我是不是做错了什么??


注意:我无法锁定发送者(并且 SOCKET_REQ 锁定执行以等待回复)。无论如何,0mq 应该在没有锁的情况下工作。 注意:我的本地是一台 mac 计算机,服务器是一个带有 ubuntu 的亚马逊实例(我认为这不会影响,但我正在写它以防万一)。


编辑:澄清一下,我不想通过互联网发送数据,我只是想在遇到这个问题时以高延迟测试 zeromq。

最佳答案

问题是 Pieter 的文档所称的“慢速连接器”。这是错误的命名,因为它暗示订阅者/监听器是问题的根源。事实并非如此。

问题很可能出在发布商方面。您在发布者连接之前发送消息。

这怎么可能? zmq_connect 或 zmq_bind 返回所以你必须准备好。 ,你不是。

显然,当连接/绑定(bind)返回时,连接/发布设置尚未完成。连接在函数返回后的某个时间完成。

那么你是如何解决这个问题的呢?最简单的方法是等待。这样做的问题是您不知道要等待多长时间,实际时间取决于特定的网络情况和所涉及的硬件。

更好但更复杂的方法是为您的发布者地址设置本地订阅者并重复发布管理消息,一旦收到该消息就会让您知道您已经准备就绪。

关于php - zeromq - 总是丢失第一条消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11634830/

相关文章:

c# - ZeroMQ C# Ironhouse 示例

c++ - 不使用 sleep() 发送 ZeroMQ 消息

php - Ratchet Websocket 无法从客户端接收数据?

c++ - 如何使用 ZMQ 发送字符串结构

php - 使用 CSS 样式化代码块

PHP 和 MySQL : php is not finding the image path given by mysql

zeromq - NetMQ 与 ZMTP 1.0 兼容吗?

ubuntu - 如何从源代码在 Ubuntu 16.10 上安装 ZeroMQ 4

php - Magento 设置资源 : Installer script not running

php - 在表中显示 MySQL 数据以及数据子集