2013-05-01 92 views
17

我想编写非阻塞应用程序。我使用apache2,但我正在阅读关于nginx及其关于apache进程的优势。我正在考虑更换apache for nginx。我的问题是,是否可以使用php和nginx编写非阻塞Web应用程序?编写PHP非阻塞应用程序

或者是使用python,使用一些反向代理(如uwsgi或gunicorn与nginx)来尝试执行此操作的更好主意?或者是学习nodejs的解决方案?

回答

12

在php中编写非阻塞应用程序是可能的,但它可能不是最好的环境,因为它并没有牢记这一点!使用过程控制库PCNTL可以很好地控制您的子进程,但它显然不会为您提供与其他环境一样易用的易用性!

我不知道蟒蛇很好,但个人我建议你去nodejs!这是一项相当新的技术,这是真的,但所有东西都是非阻塞的,它就是这样的!基本上你所拥有的是一个单一的线程(你可以在这个新闻版本中扩展你想要的),并且从字面上看,除了你告诉它做不同的事情之外,所有的事情都是由事件驱动的,在处理队列上留下空间作为预期!

Nodejs真的很容易学习,如果你偶然发现了web应用程序,反正你知道javascript!它仍然没有很大的文件记录,但是有很多准备使用的模块可以直接下载和使用!

+3

@DarthVader JavaScript是一种真正强大的语言,一旦你知道如何处理它!你知道你会有很多回调,对吧?知道事先给予你思考不同的可能性,而不是只需要一些jquery functionallity的普通web开发人员:D我并不认为nodejs只是一个玩具应用交易!就像往常一样,一切都取决于你需要的东西!但我可以向你保证,我已经看到了该死的js项目! – Ivo 2013-05-01 05:56:00

+0

@DarthVader关于python的一些评论? – 2013-05-01 05:58:31

+0

不,它不是。你可以比较JS与C#或Java?它是一种不同的语言。 – DarthVader 2013-05-01 05:58:37

2

如果您想要无阻塞的应用程序没有很多的努力,您可以尝试使用pushpin。我在我的一个应用程序中使用它,它效果很好。你可以找到作者的更多信息blog post。我在现有项目的基础上增加了这个功能,几乎不会改变现有的代码。

如果您想使用节点,请确保这是正确的工具。检查堆栈溢出问题,因为已经有了该问题的答案。问问自己,如果你的应用程序的想法符合节点功能。例如,尝试使用Why and When to use node js?How to decide when to use NodeJS?

3

我还没有图钉看着呢,但我在写这个答案指向一个支持PHP非阻塞应用另一个框架:

阵营http://reactphp.org/

它支持服务器绑定HTTP或WebSocket,并且可以通过转发(使用proxy_pass)请求通过HTTP向其通过Web服务器软件(如Nginx)使用。您甚至可以在网络服务器中使用HTTPS并转发未加密的。 (缺乏对React的SSL支持。)

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

该风格类似于编写node.js,您将PHP 5.3+闭包附加到事件,并且它在下面透明地使用了非阻塞套接字。在该网站上有很好的例子,所以我不会在这里重复,因为你没有特别要求用例。

更新:我只是看着图钉网站,它不是一个框架或工具,用于根据问题标题中的要求编写非阻塞的PHP应用程序。它看起来好像它将作为解决方案的一部分很有用。

4

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"; 
});