PHP:Stomp - 是否有可能在“send()”上捕获错误?

时间:2012-05-13 08:55:38

标签: php stomp

我正在使用PHP Stomp client发送stomp消息。

我想在后台打开持久连接,偶尔发送消息。

但是,如果在打开连接后发生连接错误(在send()上),我找不到处理连接错误的方法。

例如,在运行时:

<?php
$stomp = new Stomp('tcp://localhost:61613');

sleep(5); // Connection goes down in the meantime

$result = $stomp->send('/topic/test', 'TEST');

print "send " . ($result ? "successful\n": "failed\n");
?>

输出:send successful

即使在sleep()期间连接断开,send()也始终返回true。

docs不是很有帮助,Stomp::error()stomp_connect_error()在返回false时也无济于事。

作为临时解决方案,我在每send()之前重新连接。

有没有更好的方法来捕获连接错误?

1 个答案:

答案 0 :(得分:2)

在stomp协议本身的specification中找到答案:

  

除CONNECT之外的任何客户端框架都可以指定具有任意值的收据标头。这将使服务器确认收到带有RECEIPT帧的帧,该帧包含此标题的值作为RECEIPT帧中的receipt-id标题的值。

因此,设置“receipt”标头会使请求同步,因此与服务器的连接必须处于活动状态。

所以代码:

$result = $stomp->send('/topic/test', 'TEST');
print "send " . ($result ? "successful\n": "failed\n");

$result = $stomp->send('/topic/test', 'TEST', array('receipt' => 'message-123'));
print "send " . ($result ? "successful\n": "failed\n");

提供输出:

send successful
send failed

这似乎不是这种情况的最佳解决方案,但它适用于我。

如果有人知道更好的方式,我会很高兴听到它。


<强>更新

最终我切换到Stomp-PHP(一个纯PHP客户端)而不是Pecl stomp客户端,它处理它much better