php - 网络套接字和 PHP

标签 php node.js websocket

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

我有几个问题想知道是否有人可以帮我解决。

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

想法将不胜感激。

最佳答案

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

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 Framework),要么来自自认为聪明或想证明打败垃圾收集系统有多么容易的开发人员故意破坏垃圾收集系统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()

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

关于php - 网络套接字和 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15220501/

相关文章:

php - 从数组 : for loop not working 返回字母

php - 使用 php 从具有多个条目的数据库中获取名称列表

node.js - 请在node.js中验证我在Redis,Socke.io上的方法

rest - "WebSocket"和 "REST API"之间有何不同

c# - 在 .Net 中使用 GraphQL 客户端库的 AWS Appsync 实现

javascript - 单选按钮选择不起作用

javascript - jquery/ajax 使用用户输入作为条件运行 php 查询,然后显示查询结果而不刷新页面

node.js - Mongoose : How to display in the console the content of an Object typed Mixed?

node.js - Express 应用程序 - 更改基本网址

java - Websocket 上的 Spring STOMP - "private"消息传递