ZeroMQ apache模块

时间:2015-07-24 12:53:53

标签: php apache sockets zeromq apache-modules

有没有人知道是否已经有用于apache的zmq模块?如果有请分享链接或任何参考。我的方案如下:

服务器配置:

  1. Apache 2.4.12,带有prefork
  2. PHP 5.5
  3. ZMQ 4.0.X
  4. 我的问题是,每当我尝试从我的应用程序创建一个zmq套接字(pub)连接到一个单独的服务(SUB),其间有一个流媒体设备,它会在每次初始化应用程序时创建一个新的套接字,因为我的apache是在prefork模式下,在每个请求上创建新实例(子)。如何创建单个上下文/套接字,其中来自后续apache子进程的任意数量的PHP请求可以将数据发送到套接字,这将避免创建多个套接字并耗尽系统资源。我相信,这也将减少由于创建新套接字而导致的开销,并使其更快。

    作为替代方案,可以创建一个apache模块,我可以从PHP应用程序访问其功能和资源,并使用它来发送数据,其中上下文和套接字只创建一次,并且在apache加载期间是持久的

1 个答案:

答案 0 :(得分:1)

简短回答 - 你不能。你的问题是Apache及其工作原理 - 它在请求完成后关闭PHP进程。此外,您无法在PHP进程之间共享在Apache进程中创建的上下文或套接字。

我不知道你要做什么或为什么你甚至耗尽系统资源(很奇怪),但如果我是你,我会使用一个更高级的服务器,在内部使用ZeroMQ作为传输层:{ {3}}。您可以创建一个PHP扩展,通过FPM提供PHP,然后向您的PHP-FPM提供Apache代理请求,然后可以汇集已有的ZMQ连接。但是,我会扩大问题,说明资源如何快速耗尽。

如果那太多了,那么你可以考虑一下:

  • Apache生成的PHP进程接受数据并填充某种存储(数据库,文件,共享内存)
  • 一旦填充了makehift-queue,在退出PHP脚本之前,为查找队列的守护进程引发SIGUSR2
  • 你有一个运行守护进程来读取队列,在SIGUSR2上激活并通过ZMQ套接字发送数据 - 你现在有一个使用ZMQ的进程和多个与之交互的PHP进程

由于您的要求有点不清楚,所以我写的所有内容都很有可能,如果您可以通过更多信息稍微扩展您的问题。