如何在PHP中实现高性能的异步套接字服务器应用程序?

seb*_*seb 8 php sockets asynchronous

使用nodejs,可以非常轻松地创建非阻塞TCP服务器.nodejs.org的示例:

var net = require('net');
var server = net.createServer(function (socket) {
  socket.write("Echo server\r\n");
  socket.pipe(socket);
});
server.listen(1337, "127.0.0.1")
Run Code Online (Sandbox Code Playgroud)

nodejs为你处理select() - /poll() - /epoll()的东西,socket例程和主循环用C实现,所以它非常快速有效.

nodejs很棒,但我想在PHP中实现一个高性能的TCP套接字服务器,因为我是一个PHP人:)

所以,有一件事我已经尝试过,是落实在PHP中的socket例程,使用socket_create_listen,socket_accept,socket_select等,并在PHP主循环.这非常有效,但我认为它不是非常有效,因为我必须使用内部socket_select调用C函数select,但epoll我认为(我使用Linux)会更好,但epoll不能用作PHP函数.(phpsocketdaemonphpmio是我发现的为你实现套接字例程的2个项目).

是否有可能以nodejs的方式做到这一点?我正在考虑一个在C中实现循环和套接字例程的PHP模块,并为事件(onread,onerror..)调用PHP回调函数.还是不值得努力?

mid*_*dus 1

我认为这是一个典型的“如果你只有一把锤子,那么一切看起来都像钉子”。

正如您自己已经发现的那样,php 不是适合这项工作的工具。无论如何,你也许可以找到一种方法来做到这一点,但很可能会很混乱。

因此,请使用适合工作的正确工具。您不会用锤子将螺丝钉入墙上,对吗?

  • 我同意 PHP 不是最好的工具。但开发人员经常面临这样的情况:他们无法控制代码运行的服务器,因此安装 Nodejs 或其他替代方案可能是不可能的。在我为一家机构工作的日常工作中,我经常遇到这种情况,我们编写代码并将其发送给客户,客户将其部署在自己的环境中,我们所知道的是我们的代码必须在标准 PHP 堆栈上运行。有时我们甚至无法访问 phpinfo()。我认为保持客观并找到解决您面前问题的方法很重要。 (4认同)