关于python:编写PHP非阻塞应用程序

Write PHP non blocking applications

我想写非阻塞应用程序。我使用Apache2,但我在阅读nginx及其在Apache进程方面的优势。我正在考虑把Apache换成nginx。我的问题是,是否可以用PHP和nginx编写非阻塞的Web应用程序?.

或者使用一些反向代理(如uwsgi或gunicorn和nginx)尝试使用python来实现这一点是个更好的主意?还是学习nodejs的方法?


用PHP编写非阻塞应用程序是可能的,但这样做可能不是最好的环境,因为创建它时并没有记住这一点!使用过程控制库PCNTL,您可以很好地控制您的子进程,但它显然无法提供与其他环境相同的易用性!

我对Python不太了解,但我个人建议你去玩Nodejs!这是一项相当新的技术,确实如此,但所有的东西都是不受阻挡的,而且它注定是这样的!基本上,您所拥有的是一个线程(您可以在这个新闻版本中扩展您想要的任何内容),并且实际上所有的事情(除非您告诉它做不同的事情)都将是事件驱动的,这会给进程队列留下按预期进行的空间!

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


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

  • skyray,一个用于php-writen的网络库,位于c http://github.com/bixuehujin/skyray
  • 如上所述,reactphp是用纯php编写的
  • swoole,https://github.com/swoole/swoole-src
  • phpdemon,https://github.com/kakserpom/phpdemon
  • 顺便说一句:我是Skyray的作者,也是Swoole的开发者之一。


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

    下面是一个例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $fp = stream_socket_client("tcp://127.0.0.1:80", $code, $msg, 3);
    $http_request ="GET /index.html HTTP/1.1



    "
    ;
    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
    "
    ;
    });
    swoole_timer_tick(1000, function() {
        echo"1000ms interval
    "
    ;
    });

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

    反应http://reactphp.org/

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

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

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

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


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

    如果要使用节点,请确保这是适合该作业的工具。检查堆栈溢出问题,因为已经有了该问题的答案。问问自己,您的应用程序想法是否适合节点功能。尝试使用节点JS的原因和时间?如何决定何时使用nodejs?例如。