编写PHP非阻塞应用程序

编写PHP非阻塞应用程序,php,python,node.js,nginx,nonblocking,Php,Python,Node.js,Nginx,Nonblocking,我想写非阻塞应用程序。我使用apache2,但我读的是关于nginx及其相对于apache进程的优势。我正在考虑将apache换成nginx。我的问题是,是否可以用php和nginx编写非阻塞web应用程序 或者是一个更好的想法,尝试用python实现这一点,使用一些反向代理,比如uwsgi或gunicorn与nginx?还是学习nodejs的解决方案 在php中编写非阻塞应用程序是可能的,但这可能不是最好的环境,因为创建它时没有考虑到这一点!您可以使用process control libra

我想写非阻塞应用程序。我使用apache2,但我读的是关于nginx及其相对于apache进程的优势。我正在考虑将apache换成nginx。我的问题是,是否可以用php和nginx编写非阻塞web应用程序


或者是一个更好的想法,尝试用python实现这一点,使用一些反向代理,比如uwsgi或gunicorn与nginx?还是学习nodejs的解决方案

在php中编写非阻塞应用程序是可能的,但这可能不是最好的环境,因为创建它时没有考虑到这一点!您可以使用process control library对您的子进程进行相当不错的控制,但它显然无法提供其他环境所能提供的易用性

我对python不太了解,但就我个人而言,我建议你和我一起去!这是一项相当新的技术,这是真的,但那里的一切都是非阻塞的,它的本意就是这样!基本上,您只有一个线程(在本新闻版本中,您可以按照自己的意愿扩展它),实际上,所有的事情(除非您告诉它要做不同的事情)都将是事件驱动的,这样就可以在进程队列上按预期留有继续的空间


Nodejs真的很容易学,如果你偶然发现web应用程序,你无论如何都知道javascript!它仍然没有大量的文档记录,但是有许多现成的模块可以直接下载和使用

如果你想不费吹灰之力就拥有非阻塞应用程序,你可以尝试使用。我在我的一个应用程序中使用了它,效果非常好。你可以找到更多关于作者的信息。我在现有项目的基础上添加了这个,几乎没有更改现有代码


如果要使用节点,请确保这是适合该作业的工具。检查堆栈溢出问题,因为该问题已经有答案。问问自己,您的应用程序想法是否适合节点功能。举个例子。

我还没有研究pushpin,但我写这个答案是为了指向另一个支持PHP中非阻塞应用程序的框架:

反应

它支持将服务器绑定到HTTP或WebSocket,并可通过HTTP向其转发(使用代理传递)请求,与webserver软件(如Nginx)一起使用。您甚至可以在Web服务器中使用HTTPS并转发未加密的内容。(React中缺少SSL支持。)

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

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


更新:我只是查看了pushpin网站,它不是一个框架或工具,用于编写问题标题中要求的非阻塞PHP应用程序。不过,作为解决方案的一部分,它似乎确实很有用。

据我所知,有几个库可用于构建非阻塞应用程序

  • Skyray,一个用C编写的PHP网络库
  • reactphp,如上所述,是用纯PHP编写的
  • 斯沃奥尔
  • phpdaemon
  • 顺便说一句:我是Skyray的作者,也是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";
    });
    

    @一旦您知道如何使用DarthVader javascript,它将是一种非常强大的语言!你知道你会收到很多回电,对吧?知道了Previor,你就有可能思考不同的东西,而一般的web开发人员只需要一些jquery功能:D我真的不认为nodejs只是一个玩具应用程序交易!当然,一切都取决于你需要什么!但我可以向你保证,我见过js中的该死的大项目@DarthVader对python有什么评论?不,不是。你能将js与c#或java进行比较吗?这是一种不同的语言。@Lucas在node中开发是非常不传统的。。。这显然是正确的,许多项目甚至不符合目标!但是一旦你知道它不是正确的工具,你甚至不应该尝试使用它,因为其他平台都会做得更好!根据我的经验,真正能很好地满足目标的应用程序非常少,正是那些严重依赖事件驱动编程的应用程序或通常花费大量时间等待事件发生的程序!这不仅优化了性能,而且使节点看起来更简单。。。不过,这只是我的观点:PI认为在node.js中编写大型应用程序更容易。PackageManagerNPM使模块化不同组件和随用构建变得非常容易。还正在运行一个巨大的node.js安装,似乎在Skyray上做得很好。