1

我正在寻找编写一个 PHP 脚本来充当一个迷你“守护程序”来从远程套接字接收数据。远程服务器是一个 Asterisk VoIP 服务器,我将连接到 Asterisk 管理接口 (AMI) 以尝试接收 AMI 事件通知。连接将通过一个永远在线的 SSH 隧道(使用 autossh),到目前为止,它已经足够稳定,可供我们使用。

这是计划...

  • fsockopen()一个 PHP 脚本连接到 SSH 隧道的本地端口,它使用或很可能转发到另一端的远程端口pfsockopen()
  • PHP 脚本将从 CLI 运行,我想我应该在 cron 作业上使用某种 shell 脚本来检查 PHP 脚本是否由于任何原因没有停止
  • 我需要这个 PHP 脚本永久运行,并永久连接到套接字以在另一端发布数据时接收数据
  • 内存和 CPU 不是问题,因为我们的 Intranet 服务器上有大量资源(犯罪地未充分使用),但同样我不希望这个脚本失控
  • PHP 脚本有望对偶尔出现在套接字另一端的数据做出反应,有时会在 MySQL 数据库中插入或更新数据。显然,我会在必要时打开/关闭 MySQL 连接,而不仅仅是让它挂起。

首先,这是一个永远不会奏效的可怕想法吗?

我意识到对于像这样的小型守护进程来说,PHP 可能不是最好的语言,但我之前在 CLI 上使用 PHP 取得了成功,这是我现在最熟悉的语言。

当数据在套接字的另一端发布时,是否有任何 PHP 函数可以生效?
或者我会fread()像这样循环使用......

while (!feof($socket)) {
$output .= fread($socket, 8192);
}

循环选项似乎有点乱,所以我只是想知道是否有另一种方式意味着脚本保持连接到套接字但基本上是空闲的,直到出现一些数据。

在考虑将永久运行的 PHP 脚本连接到套接字时,我应该注意哪些缺点/陷阱?

干杯,B

4

2 回答 2

1
  • 在编写 PHP 守护程序时,您应该注意内存消耗。如果不小心 unset()/free()d,你的守护进程可能会随着时间的推移吃掉越来越多的内存。

  • 正如您已经说过的,PHP 不是最好的语言,但它肯定会起作用。我已经做了几次“破解”。

  • 请注意 TCP 套接字上的 fread() 将是非阻塞的。由于每一行都是 CR/LF 终止 (\r\n) 并且两个 CR/LF 标记 AMI 事件/命令的结束,您可能想要阅读直到“\r\n\r\n”发生,然后处理这个事件,然后再次开始阅读。我会设置套接字阻塞并使用 fgets() 而不是 fread()。这样更容易检测 AMI 事件的结束 - 无需进行字符串魔术/拆分。

于 2011-10-28T12:15:38.650 回答
1

看看 ZeroMQ,异步消息库。 http://en.wikipedia.org/wiki/ZeroMQ

这是php绑定的链接:

http://www.zeromq.org/bindings:php

于 2011-10-28T12:19:39.573 回答