4

我开始考虑将 websockets 作为在我正在调试的新构建 PHP 应用程序中替换长轮询的解决方案。

我有几个问题,我想知道人们是否可以帮助我。

  1. Nodejs 服务器可以调用 PHP 吗?如果可以的话,它在连接方面不会像通过 Apache 那样遭受同样的缺点吗?我们都知道 nodejs 是非阻塞的,而 Apache 等不是,但是如果 Nodejs 只是在它自己的过程中调用 PHP 服务器,那不会以类似的方式出现瓶颈吗?
  2. PHP 和 websockets 是一个很好的匹配吗?
  3. 除了显然只适用于 Nodejs 的 socketio 之外,还有什么好的 js 库吗?
  4. 有没有人找到一个很好的教程,它使用 websockets 和 PHP 后端,可能使用类似 Ratchet PHP 库的东西,这可能会帮助我上路?

想法将不胜感激。

4

2 回答 2

2

请原谅我对您的问题的解释。

1:Node.js能不能调用PHP,那岂不是和Apache有同样的缺点?

调用一次运行的 PHP 脚本将具有与调用网页相同的一般缺点,除了您要删除额外的处理层。Apache 或任何 Web 服务器本身就是一个非常薄的层,虽然您可以节省一些时间,但节省的时间却微不足道。

无论出于何种原因,如果 PHP 在为您的客户端收集数据方面比 Node.js 更有效,那么在您的应用程序中包含 PHP 可能是明智的。

2:PHP 和 WebSockets 是很好的搭配吗?

传统的 PHP 脚本通常旨在每个请求运行一次。绝大多数 PHP 开发人员不熟悉事件驱动开发,而且 PHP 本身(还)不支持异步处理。

PHP 是一种快速、成熟的脚本语言,它只会变得越来越快,尽管它有许多缺点和缺点。(有人说它的弱打字是一个缺点。也有人说它的打字不够弱是一个缺点。)

也就是说,任何语言实现 WebSockets 所需的最低限度是打开基本 TCP 端口并监听请求的能力。对于 PHP,它被实现为 C 套接字库的精简包装器,并且还有其他可用的扩展和框架也可以改变使用 PHP 在 TCP 套接字中工作的感觉。

PHP 的垃圾收集器也已经成熟。内存泄漏要么来自对内存空间的严重漠视(我在看着你,Zend 框架),要么来自自认为聪明或想要证明击败GC。(剧透:如果你知道细节的话,每种语言都很容易!)

在 PHP 中设置守护进程(长时间运行的后台进程)是非常可能且非常容易的。甚至可以让它表现得足够好,以优雅地重新启动并将其连接移交给同一脚本的新版本,甚至是运行不同版本 PHP 的同一服务器上的同一脚本,尽管这超出了范围只是一个一点点。

至于是否匹配,完全取决于开发者。您是否愿意、有能力并且乐于使用 PHP 编写 WebSockets 服务器,或者使用现有的服务器之一?是的?那么你就是PHP 和 WebSockets 的好搭档。

3:WebSockets 的 JS 库

老实说,我没有研究过它们。

4:使用 PHP 和 Websockets 的教程

我个人很喜欢这个教程:http ://www.phpbuilder.com/articles/application-architecture/optimization/creating-real-time-applications-with-php-and-websockets.html

尽管我很有权威地认为该教程的细节对于该特定的 WebSockets 服务器很快就会过时。(不过,该服务器仍将有一个积极维护的遗留分支。)

如果链接失效:

使用 PHP-Websockets 服务器(在 Github 上可用,很快就会被托管),扩展基本WebSocketServer抽象类并实现抽象方法process()connected()closed()

不过,上面的链接有更好的信息,所以只要链接存在,就跟着它。

于 2015-06-16T00:11:32.407 回答
1
  1. 如果你通过 apache,它会遇到同样的瓶颈。这可以通过使用不同的 Web 服务器来解决,例如lighthttpdnginx。你甚至根本不需要节点。
  2. PHP 没有像样的共享内存,这使得 WebSockets 的最大优势无关紧要。如果您不想在用户之间进行交互,它应该足够体面,但即使那样我也不得不对 PHP 的使用皱眉头。PHP 在很多方面都很棒,但实时通信不是其中之一。
  3. 您可能想查看https://github.com/einaros/ws
  4. PHP 不是一个好的后端。任何具有在其自己的沙箱中运行后遗忘的执行模型,例如Node.NETC/C++Java都是很好的匹配。PHP 适用于短期运行的执行,例如实际的网站甚至 Web 服务——但不适用于实时连接。
于 2013-03-05T09:57:53.197 回答