【问题标题】:ZMQ Context is not sending data from the browser/PHP but works from CMD/CLI (Windows 10)ZMQ 上下文不是从浏览器/PHP 发送数据,而是从 CMD/CLI (Windows 10) 工作
【发布时间】:2019-11-10 08:33:33
【问题描述】:

通过命令行调用 post.php 会将数据发送到我的网络套接字服务器。如果您通过浏览器调用相同的脚本,则不会。

这个问题只发生在我的本地机器上。一旦使用相同的 PHP 版本/设置部署到 Centos 7,它就可以在浏览器中正常工作。

1) 将服务器绑定 IP 更改为 0.0.0.0 而不是 127.0.0.1
2) 更改服务器和客户端端口

// This is our new stuff
$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'my pusher');
$socket->connect("tcp://127.0.0.1:55555");
$socket->send(json_encode($entryData));

预期的结果是在 CLI/CMD 上输出数据。这不是在本地发生的。没有错误。

【问题讨论】:

  • “这个问题只发生在我的本地机器上。”这意味着您的本地机器上可能发生了一些事情,您缺少任何防火墙或设置,是否真的需要在路由器上打开端口?还想知道您是否在正确的 IP 上发送?您是否检查过是否可以使用正确的 IP 执行“ping 127.0.0.1”。
  • 当你上面的 MCVE 代码甚至没有尝试检查错误状态指示时,你怎么能说 “没有错误。” ) ?

标签: php zeromq


【解决方案1】:

QZMQ Context 没有从浏览器/PHP 发送数据

尽管观察到的失望,我已经和 ZeroMQ 一起生活了一段时间,从 2.11+ 开始,现在是 some 时间,我敢说一句坏话关于 ZeroMQ 设计和 Zen-of-Zero 的艺术。

鉴于您的 MCVE 代码甚至没有尝试收集和验证无错误状态,因此在运行时,很难在没有可用细节的情况下进行分析。

不要猜测,
最好的下一步是:设置一个套接字-Monitor 以实时查看所有事件

您的使用上下文与tcp://-transport-class 配合使用,因此您很高兴能够衍生出一个套接字-Monitor

事件库,socket-Monitor 可以在实时会话中扫描/报告,因为它们出现了 - 这样一个人就可以 POSACK 任何预期行为(和事件顺序),和/或检测任何意外事件——如出现:

ZMQ_EVENT_CONNECTED,
ZMQ_EVENT_CONNECT_DELAYED,
ZMQ_EVENT_CONNECT_RETRIED,
ZMQ_EVENT_LISTENING,
ZMQ_EVENT_BIND_FAILED,
ZMQ_EVENT_ACCEPTED,
ZMQ_EVENT_ACCEPT_FAILED,
ZMQ_EVENT_CLOSED,
ZMQ_EVENT_CLOSE_FAILED,
ZMQ_EVENT_DISCONNECTED,
ZMQ_EVENT_MONITOR_STOPPED,
ZMQ_EVENT_HANDSHAKE_FAILED,
ZMQ_EVENT_HANDSHAKE_SUCCEED

如何实例化 ZeroMQ 套接字-Monitor ?

ZeroMQ 使用双面基础架构,其中第 1 部分)通过调用
int zmq_socket_monitor ( void *socket, char *endpoint, int events );Context()-实例引擎“内部”进行实例化>

这将完成前半部分的工作 - 为 Context() 配备一个新的(内部,配备已发布的内部 .bind()inproc://-transport-class)AccessPoint ,因此准备好从套接字的后半部分获取外部.connect()-ed-Monitor - 一个外部ZMQ_PAIR-基于原型的事件监听器(无论该角色扮演谁)

基础设施的第 2 部分)只是 .connect()-s 到第 1 部分,其余的都是你的。 API 文档定义了有关通过此链接从受监控的-Context()-实例发送到监控侦听器手中的多帧消息的所有详细信息。

鉴于上面定义的问题,这个套接字-Monitor 肯定会反映所有 ZeroMQ-ZMTP/RFC 派生的事件,并使它们以自然顺序报告,当它们出现时(如果它们出现),Monitor-Listener 可以用纳秒级精确时间戳标记每个这样,并在单独的(遥测专用诊断) GUI/CLI。

zmq_socket_monitor() 方法允许应用程序线程跟踪 ZeroMQ 套接字上的套接字事件(如连接)。对该方法的每次调用都会创建一个 ZMQ_PAIR 套接字并将其绑定到指定的 inproc:// 端点。要收集套接字事件,您必须创建自己的 ZMQ_PAIR 套接字,并将其连接到端点。

events 参数是您希望监控的套接字事件的位掩码,请参阅下面的支持的事件。要监控所有事件,请使用事件值 ZMQ_EVENT_ALL

注意:随着新事件的添加,catch-all 值将开始返回它们。依赖于严格且固定的事件序列的应用不得使用 ZMQ_EVENT_ALL 以保证与未来版本的兼容性。

每个事件都作为两帧发送。第一帧包含一个事件编号(16 位)和一个根据事件编号提供附加数据的事件值(32 位)。第二帧包含指定受影响的 TCP 或 IPC 端点的字符串。

对于示例监视器解码器代码,可以look here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 2018-07-11
    • 2022-06-29
    • 2013-09-23
    • 2014-07-16
    相关资源
    最近更新 更多