我想编写非阻塞应用程序。我使用 apache2,但我正在阅读有关 nginx 及其在 apache 进程方面的优势。我正在考虑为 nginx 更换 apache。我的问题是,是否可以使用 php 和 nginx 编写非阻塞 Web 应用程序?
或者尝试使用 python 执行此操作是一个更好的主意,使用像 uwsgi 或 gunicorn 和 nginx 这样的反向代理?或者是学习nodejs的解决方案?
我想编写非阻塞应用程序。我使用 apache2,但我正在阅读有关 nginx 及其在 apache 进程方面的优势。我正在考虑为 nginx 更换 apache。我的问题是,是否可以使用 php 和 nginx 编写非阻塞 Web 应用程序?
或者尝试使用 python 执行此操作是一个更好的主意,使用像 uwsgi 或 gunicorn 和 nginx 这样的反向代理?或者是学习nodejs的解决方案?
在 php 中编写非阻塞应用程序是可能的,但它可能不是这样做的最佳环境,因为它不是在创建时牢记这一点!您可以使用进程控制库PCNTL对您的子进程进行相当不错的控制,但它显然不会为您提供与其他环境相同的易用性!
我不太了解 python,但我个人建议你使用nodejs!这是一项相当新的技术,这是真的,但那里的一切都不是阻塞的,而且应该是这样的!基本上你所拥有的是一个单线程(你可以在这个新闻版本中随意扩展它)并且实际上所有的东西(除了你告诉它做不同的事情)都将是事件驱动的,留下空间来继续进程队列预期的!
Nodejs 真的很容易学习,如果你偶然发现了 Web 应用程序,那么无论如何你都知道 javascript!它仍然没有大量文档,但是有许多可以立即下载和使用的现成模块!
据我所知,有几个库可用于构建非阻塞应用程序。
BTW:我是 Skyray 的作者,也是 swoole 的开发者之一。
我还没有看过图钉,但我写这个答案是为了指向另一个在 PHP 中支持非阻塞应用程序的框架:
它支持将服务器绑定到 HTTP 或 WebSocket,并且可以通过通过 HTTP 向其转发(使用 proxy_pass)请求来与 Nginx 等网络服务器软件一起使用。您甚至可以在网络服务器中使用 HTTPS 并转发未加密的内容。(React 中缺少 SSL 支持。)
似乎还没有 FastCGI 或 UWSGI 支持,至少上游项目中没有。
这种风格类似于编写 node.js,您将 PHP 5.3+ 闭包附加到事件,并且它在下面透明地使用非阻塞套接字。该网站上有很好的例子,所以我不会在这里重复它们,因为你没有具体要求一个用例。
更新:我刚刚查看了图钉网站,它不是用于编写问题标题中要求的非阻塞PHP应用程序的框架或工具。不过,作为解决方案的一部分,它似乎确实很有用。
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";
});
如果您想轻松拥有非阻塞应用程序,可以尝试使用图钉。我在我的一个应用程序中使用它并且效果很好。您可以在作者的博客文章中找到更多信息。我在现有项目之上添加了这个,几乎没有更改现有代码。
如果您想使用节点,请确保这是适合该工作的工具。检查堆栈溢出问题,因为该问题已经有了答案。问问自己,您的应用程序想法是否适合节点功能。尝试为什么以及何时使用 node js?以及如何决定何时使用 NodeJS?例如。