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