我正在创建一个带有服务器后端的移动应用程序,它将对用户进行身份验证并不断向他们发送更新,同时监听来自移动应用程序的发布数据。这些更新将特定于个人,从数据库中提取。
从我的研究看来,我应该使用 websocket。我熟悉 PHP,所以尝试过 Ratchet。我用 Ratchet 创建了一个简单的聊天脚本,它查询数据库 onMessage 并将数据发送到客户端。
我的问题是,websockets 适合这个吗?当服务器收到连接时,它必须每 5 秒查询一次数据库并将更新的信息发送到应用程序。它必须监听将更改数据库查询的消息。 Ratchet 文档中的所有内容似乎都集中在订阅主题上,而不是单独对待每个客户,尽管我已经通过使用以下方法解决了这个问题:
$client = $this->clients[$from->resourceId];
$client->send("whatever_message"):
我是否使用 Ratchet 使事情复杂化?还是应该使用子进程来处理每个客户端?
我很抱歉有一个模糊的问题。我已经尽我所能进行了研究,但无法确定我是否在朝着错误的方向前进!感谢您的任何帮助。
最佳答案
这是一个很好的公式。在保持套接字连接的同时从应用程序发送发布数据是一个很好的进程分布。但是,PHP 可能不是运行套接字服务器的最佳选择。
这样做的原因是 PHP 是一种单线程语言,它没有优雅的事件系统。
以 NodeJs 作为替代方案。它也是单线程的,但是您可以在套接字服务器上注册事件,允许软件在等待网络事件时运行其他控制进程。
但是,这并不限制您使用 javascript。工作仍然可以从 NodeJs 应用程序委托(delegate)给 PHP 进程(我仅将 NodeJs 用作示例,还有其他选项,例如 Java、Python 或良好的原生)。
要将工作转移到 PHP,您可以执行命令或使用作业服务器来启用同步和异步任务。
您可以结合使用以下一些资源来实现此目的:
http://nodejs.org/
http://socket.io/
http://gearman.org/
http://php.net/manual/en/book.gearman.php
如果您使用的是 Symfony:
https://github.com/mmoreram/GearmanBundle
关于用于移动应用程序的 PHP websocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25644937/