与PHP守护进程通信的最有效方法是什么?

时间:2014-07-16 16:24:17

标签: php messaging

我做了一些PHP守护进程,现在我希望我的PHP webapp与它通信,例如发送XML文档并在一段时间后收到响应。由于我想避免通过网络进行文件操作(因为它涉及FTP),发送此文档的理想方式是什么? PHP守护程序和PHP Web应用程序位于不同的服务器上。 到目前为止,我已经调查了各种选项:

  • ActiveMQ,但增加了额外的英国媒体报道
  • TCP套接字(然而,它很难像PHP守护进程那样做 单线程,有时很忙)
  • FTP,SCP发送文件
  • NFS / CIFS
  • 使用数据库

如果消息服务器看起来是最好的选择,最适合PHP的是什么?我想避免使用集中式单一消息服务器,因为它很难批准防火墙规则,并且网络非常庞大,复杂并且非常容易出错。 因此,需要星形网络的消息服务器,因此需要非常轻量级,易于部署且没有困难的依赖。

2 个答案:

答案 0 :(得分:2)

与您的守护进程通信包含两个完全不同的方面:

  • 将数据发送到守护程序
  • 从守护程序
  • 接收数据

当我不得不解决一个非常类似的问题时,我很难学到这一点。

将数据发送到守护程序受限于单线程守护程序无法轻松侦听的事实。我这样解决了:

  • 当守护程序空闲时,它会轮询SysV-Messagequeue
  • 当消费者想要请求守护进程时,它会创建一个可通过不可访问的URL访问的命令文件。然后它将该URL传输到守护进程的SysV-Messagequeue(参见下面的方法)
  • 空闲守护进程看到该消息,通过URL获取命令文件,对其进行处理
  • 命令文件有一个URL,用于将结果发布到
  • 守护程序使用cURL来传递它。

这对于作为消费者的webapp来说非常自然 - 繁重的工作完全按照Web请求完成:守护程序在空闲时都会启动这两个方向。

现在有关如何将消息发送到守护程序:最简单的方法是让某种服务器在那里运行

  • 如果网络服务器已在目标计算机上运行,​​请使用一个小脚本,该脚本只接受明确定义的一组消费者的URL并将其排队
  • 如果没有,带有简单shell脚本或几行C代码的inetd或xinetd可以解决这个问题
  • 如果你想要更健壮的东西,你可以通过SSH启动一个queuer命令

我们使用生产中的所有三种变体并获得优异的结果:如果消费者跟踪已经处理过的命令文件,可以很容易地排除由于网络不稳定而导致的双重执行。

答案 1 :(得分:1)

答案显而易见:使用TCP但不要使用单线程编程语言作为TCP守护程序。

如果你想为 workers 使用PHP,也许是因为你希望他们使用共享的PHP库,你可以用支持线程的编程语言编写最小的守护进程,并转发请求PHP帮助程序脚本(或者如果要在不同主机上部署工作程序,则为池化,单线程TCP守护程序,这有利于可伸缩性)

但是,已经存在满足要求的软件:Gearman