【问题标题】:Write PHP non blocking applications编写 PHP 非阻塞应用程序
【发布时间】:2013-04-25 03:50:50
【问题描述】:

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

或者尝试使用 python 执行此操作是一个更好的主意,使用诸如 uwsgi 或 gunicorn 和 nginx 之类的反向代理?或者是学习nodejs的解决方案?

【问题讨论】:

    标签: php python node.js nginx nonblocking


    【解决方案1】:

    用 php 编写非阻塞应用程序是可能的,但它可能不是这样做的最佳环境,因为它不是在创建时牢记这一点!您可以使用进程控制库 PCNTL 对您的子进程进行相当不错的控制,但它显然无法为您提供与其他环境相同的易用性!

    我不太了解python,但我个人建议你使用nodejs!这是一项相当新的技术,这是真的,但那里的一切都不是阻塞的,而且应该是这样的!基本上你所拥有的是一个单线程(你可以在这个新闻版本中随意扩展它)并且实际上所有的东西(除了你告诉它做不同的事情)都将是事件驱动的,留下空间来继续进程队列期待!

    Nodejs 真的很容易学习,如果你偶然发现了 Web 应用程序,那么无论如何你都知道 javascript!它仍然没有大量文档,但有许多现成的模块可供您立即下载和使用!

    【讨论】:

    • @DarthVader javascript 是一种非常强大的语言,一旦你知道如何使用它!你知道你会有很多回调,对吧?与只需要一些 jquery 功能的普通 Web 开发人员相比,知道先验使您有可能进行不同的思考:D 我真的不认为 nodejs 只是一个玩具应用程序!和往常一样,几乎一切都取决于你需要什么!但我可以向你保证,我见过用 js 编写的大项目!
    • @DarthVader 一些关于 python 的 cmets?
    • 不,不是。你能将js与c#或java进行比较吗?这是一种不同的语言。
    • @Lucas 在 node 中开发是非常规的......这显然是真的,许多项目甚至不适合目标!但是一旦你知道它不是正确的工具,你甚至不应该尝试使用它,因为其他所有平台都会做得更好!以我的经验,真正适合目标的应用程序非常少,正是那些严重依赖事件驱动编程或通常花费大量时间等待某事发生的程序的应用程序!这不仅优化了性能,而且让节点一目了然……不过这只是我的看法:P
    • 我认为在 node.js 中编写大型应用程序更容易。包管理器 npm 使得模块化不同的组件和构建变得非常容易。 voxer.com 也正在运行一个巨大的 node.js 安装,似乎一切正常
    【解决方案2】:

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

    1. Skyray,一个用 C 语言编写的 PHP 网络库 http://github.com/bixuehujin/skyray
    2. reactphp,如上所述,用纯 PHP 编写
    3. swoole,https://github.com/swoole/swoole-src
    4. phpdaemon, https://github.com/kakserpom/phpdaemon

    顺便说一句:我是 Skyray 的作者,也是 swoole 的开发者之一。

    【讨论】:

    • Skyray 做得很好。
    【解决方案3】:

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

    反应http://reactphp.org/

    它支持将服务器绑定到 HTTP 或 WebSocket,并且可以通过通过 HTTP 向其转发(使用 proxy_pass)请求来与 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";
      });
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-05-15
          • 1970-01-01
          • 2014-03-23
          • 1970-01-01
          • 1970-01-01
          • 2014-09-25
          • 2017-08-24
          相关资源
          最近更新 更多