编写PHP非阻塞应用程序

29

我希望编写非阻塞应用程序。我使用apache2,但我读到了关于nginx和其相对于apache进程的优势的信息。我正在考虑将apache更换为nginx。我的问题是,是否有可能使用php和nginx编写非阻塞Web应用程序?

或者使用Python,使用一些reverse proxy(如uwsgi或gunicorn)与nginx尝试实现这一点是否是更好的想法?或者解决方案是学习nodejs吗?

5个回答

19
在php中编写非阻塞应用程序是可能的,但这很可能不是最好的环境,因为它不是为此而创建的!使用进程控制库PCNTL可以相当好地控制子进程,但显然无法像其他环境那样提供同样易用性!
我不太了解Python,但个人建议您选择Node.js!这是一项相当新的技术,但在那里一切都是非阻塞的,这也是其设计初衷!基本上,您拥有一个单线程(在新版本中可以按需扩展),除非您告诉它以不同方式执行,否则所有操作(除你指定的)都将是事件驱动的,在进程队列上留出空间以按预期进行!
如果您曾经遇到过Web应用程序,Node.js非常容易学习,因为您已经了解JavaScript!尽管文档还不是非常丰富,但有许多可供下载并立即使用的准备好的模块!

5
@DarthVader,一旦你学会如何处理它,javascript是一种非常强大的语言!你知道你将会有很多回调函数,对吧?提前知道这点让你有可能去思考不同于普通的网页开发人员,他们只需要一些jquery功能:D 我并不认为nodejs只是一个玩具应用程序交易!嗯,像往常一样,几乎所有东西都取决于你的需求!但我可以保证,我见过使用js完成了非常大的项目! - ivoputzer
@DarthVader 有关 Python 的一些评论? - Gonzalo Bahamondez
不是的。你能比较JavaScript和C#或Java吗?它们是不同的编程语言。 - DarthVader
@GonzaloBahamondez 我对Python的了解真的很少!我不能告诉你太多!抱歉... - ivoputzer
1
@Lucas 在 Node 上开发相当不寻常...这显然是真的,许多项目甚至不适合在其中运行!但一旦你知道它不是正确的工具,你就不应该试图使用它,因为其他任何平台都会做得更好!根据我的经验,真正适合目标的应用程序非常少,只有那些严重依赖事件驱动编程或通常花费大量时间等待某些事情发生的程序!这不仅优化了性能,还使 Node 发挥了它的优势...这只是我的观点 :P - ivoputzer
3
我认为在node.js中编写大型应用程序更容易。包管理器npm使得将不同的组件模块化并逐步构建变得非常简单。此外,http://voxer.com/正在运行一个庞大的node.js安装,并且似乎表现良好。 - Noah

8

做得好,Skyray。 - Lionel Yeo

6

Swoole是编写非阻塞PHP应用程序的良好选择。

以下是一个示例:

$fp = stream_socket_client("tcp://127.0.0.1:80", $code, $msg, 3);
$http_request = "GET /index.html HTTP/1.1\r\n\r\n";
fwrite($fp, $http_request);
swoole_event_add($fp, function($fp){
    echo fread($fp, 8192);
    swoole_event_del($fp);
    fclose($fp);
});
swoole_timer_after(2000, function() {
    echo "2000ms timeout\n";
});
swoole_timer_tick(1000, function() {
    echo "1000ms interval\n";
});

6

我还没有看过 Pushpin,但是我写这篇答案是为了介绍另一个支持 PHP 的非阻塞应用程序框架:

React http://reactphp.org/

它支持将服务器绑定到 HTTP 或 WebSocket,并可与 Web 服务器软件(如 Nginx)一起使用,通过 HTTP 转发(使用 proxy_pass)请求到它上面。您甚至可以在 Web 服务器中使用 HTTPS,并将其转发为非加密的方式。(React 中缺乏 SSL 支持。)

目前似乎还没有 FastCGI 或 UWSGI 支持,至少在上游项目中没有。

编写代码的风格类似于 Node.js,您可以将 PHP 5.3+ 的闭包附加到事件上,并且它会在底层透明地使用非阻塞套接字。该网站上有很好的示例,因此,我不会在此重复,因为您并没有特别要求使用案例。

更新:我刚刚查看了 Pushpin 网站,它不是用于编写非阻塞 PHP 应用程序的框架或工具,而是似乎作为解决方案的一部分会很有用。


3
如果您想要一个不需要大量努力就能实现非阻塞应用程序,可以尝试使用pushpin。我在我的一个应用程序中使用它,效果很好。您可以在作者的博客文章中了解更多信息。我将其添加到现有项目的顶部,几乎没有改变现有代码。
如果您想要使用node,请确保这是正确的工具。查看stack overflow问题,因为已经有答案了。问问自己,您的应用程序想法是否符合node的能力。例如,尝试何时以及何时不使用NodeJS?如何决定何时使用NodeJS?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接