我一直在使用 Ratchet 测试 PHP websockets,并且一切正常,直到 ZMQSocket::send 突然开始无缘无故地挂起。
$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'notify');
$res = $socket->send(json_encode($entryData)); //Hangs here.
请注意,我可以使用 ZMQ::MODE_NOBLOCK,这将停止挂起,但不能解决问题。即客户仍然没有收到任何东西。我还重新启动了我的盒子,但这并没有解决问题。
更新:我似乎通过将我的代码更改为以下内容来解决问题:
$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'notify');
$socket->setSockOpt(ZMQ::SOCKOPT_LINGER, 30); //ADDED
$socket->connect("tcp://localhost:5557"); //ADDED
$res = $socket->send(json_encode($entryData));
现在的问题是,为什么它首先会挂起,而它可以正常工作大约一两个小时?有什么我需要注意的吗?
最佳答案
首先,我不确定这是否是一个有效的答案,但我已经使用 php-zmq 玩了几天,我自己也遇到了一些问题。你的问题让我顿悟,这可能会解决我的问题,我怀疑你的问题可能与此相关。
关于我的最后一个 php-zmq 问题,我正在使用 zguide 中的跳闸方法测试笔记本电脑和 VPS 之间的往返时间。 .我所做的只是通过将 URL 添加到我的 VPS 来更改笔记本电脑上的 tripping.php 脚本副本,以便它连接到在 VPS 上远程运行的同一脚本。我在一个很长的 while 循环中运行同步部分,而异步部分使用相同的 for 循环。
我注意到在执行同步循环时,一次只能连接一个“客户端”,无论是尝试从我的笔记本电脑连接多个客户端,还是从我的笔记本电脑连接一个客户端,再从另一台服务器连接一个客户端,等等。只有一个能够在一段时间内连接。我还在异步部分注意到,一旦消息开始返回我的笔记本电脑,我的每秒消息从每秒约 100 条消息下降到每条消息约 2 秒。我的笔记本电脑可以使用 cURL 每秒轻松处理 10 多个 HTTP 请求,因此每条消息 2 秒与网络无关。
我作为一名 PHP 扩展开发人员和 PHP 核心黑客已经 6 年了,我以前遇到过这样的问题。我很确定它来自 PHP 用户空间和内部 Zeromq 线程之间的并发问题。换句话说,Zeromq IO 线程正在向 Zeromq 主线程发送命令,但 zeromq 主线程是通过 Zend 引擎在 PHP 中执行的,并且绑定(bind)到与其他 PHP 方法/函数相同的基本行为。我还不确定我们是否可以期待 php-zmq 中的行为与我们在 czmq 或其他 zeromq 绑定(bind)中的行为完全相同,因为 PHP 本质上是非常同步的,而 zeromq 是异步的。在 php-zmq 中使用非阻塞模式时,我的大部分经验都是积极的。
编辑:澄清可能的问题——Zeromq 在单独的线程中异步处理所有 IO。阻塞行为(例如 req/rep)是由 IO 线程和主线程之间的消息传递创建的,而不是实际的阻塞/同步 IO。我认为在 PHP 中可能行为不当的是线程之间的消息传递和同步。 “非阻塞”Zeromq 模式似乎工作正常。阻塞模式有效,但在这些远程案例中显示出奇怪的行为。
关于php - ZMQ 挂起 - ZMQSocket::send,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21774425/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在学习如何在我的Ruby代码中使用Module.prepend而不是alias_method_chain,我注意到有些人使用send调用它(example):ActionView::TemplateRenderer.send(:prepend,ActionViewTemplateRendererWithCurrentTemplate)而其他人直接调用它(example):ActionView::TemplateRenderer.prepend(ActionViewTemplateRendererWithCurrentTemplate)而且,虽然我还没有看到任何人使用这种风格,但我从
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我正在尝试学习Ruby词法分析器和解析器(whitequarkparser)以了解更多有关从Ruby脚本进一步生成机器代码的过程。在解析以下Ruby代码字符串时。defadd(a,b)returna+bendputsadd1,2它导致以下S表达式符号。s(:begin,s(:def,:add,s(:args,s(:arg,:a),s(:arg,:b)),s(:return,s(:send,s(:lvar,:a),:+,s(:lvar,:b)))),s(:send,nil,:puts,s(:send,nil,:add,s(:int,1),s(:int,3))))任何人都可以向我解释生成的
假设我有一个类A,里面有一些方法。假设stringmethodName是这些方法之一,我已经知道我想给它什么参数。它们在散列中{'param1'=>value1,'param2'=>value2}所以我有:params={'param1'=>value1,'param2'=>value2}a=A.new()a.send(methodName,value1,value2)#callmethodnamewithbothparams我希望能够通过传递我的哈希以某种方式调用该方法。这可能吗? 最佳答案 确保methodName是一个符号,而
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它
我一直在尝试使用Thor编写一个小型库,以帮助我快速创建新项目和站点。我写了这个小方法:defssh(cmd)Net::SSH.start(server_ip,user,:port=>port)do|session|session.execcmdendend只是协助我在需要时在远程服务器上运行快速命令。问题是当我需要在远程端的sudo下运行命令时,脚本似乎卡在我身上。例如当执行这个...ssh("sudocp#{file_from_path}#{file_to_path}")脚本会提示我输入密码[sudo]passwordforuser:但是在输入之后整个事情就挂起。有人会碰巧知道它为
我有几个跳过的规范。Pending:(Failureslistedhereareexpectedanddonotaffectyoursuite'sstatus)1)...#Notyetimplemented#./spec/requests/request_spec.rb:22如何抑制未决规范的输出? 最佳答案 您可以添加以下配置选项以从运行中过滤掉所有待处理的规范:RSpec.configuredo|config|config.filter_run_excludingskip:trueend此外,here是一个更详细的抑制输出的建议
我不知道为什么,但是当我在我的Rails项目中运行rake命令时,没有任何反应。railsserver什么也不做。有什么建议吗? 最佳答案 你可以在开头添加一个“ruby-rtracer”以查看它卡在哪里。 关于ruby-on-rails-Rails和Rake命令挂起并且什么都不做,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/3657296/
我的生产Rails应用程序需要167秒来运行rakedb:migrate。可悲的是,没有要运行的迁移。我试图在检查是否有待处理的迁移时调整运行的迁移,但随后检查花费了同样长的时间。我心目中唯一的“借口”是数据库并不小,那里有1M条记录,但我看不出这有什么关系。我查看了日志,但没有任何迹象表明出了什么问题。我在运行ruby2.2.0rails4.2.0有没有人知道为什么会这样,是否有什么办法可以解决? 最佳答案 运行rakedb:migrate任务还会调用db:schema:dump任务,这将更新您的db/schema.rb。因此,即