ReactPHP:PHP版的Node.js

从名字说起 

虽然ReactPHP项目已经发展了有4年之久,但是对于其称呼显得有点混乱。在开源中国为其建立的项目主页上,其被命名为React,或者node.PHP。国外的一些的博客谈及这个项目时,多数使用的是ReactPHP。到底哪种说法比较标准呢?我们不妨来看看官方的态度。此项目的官方主页是 http://www.reactphp.org 。打开官网,你会发现网站的title是React,其logo上的文字为reactphp。可以看出,官方更倾向于被命名为React或者ReactPHP。我建议使用ReactPHP作为其名称。原因大概有两个。

  1. React单词的意思太泛,并且已经有一些项目的名称与React相关,容易引起误解。
  2. 目前国内使用ReactPHP的人比较少,相关资料文档也比较少。在国外它一般被称为ReactPHP,使用ReactPHP在国外检索资料更容易。

ReactPHP与Node.js有着相同的特点

许多人认为ReactPHP是Node.js的php版本,这是有一定道理的。他们的确有很多相似的特点。

事件驱动,异步执行,非阻塞IO

什么是事件驱动?所谓事件驱动,简单的说就是,你告诉我你关注什么事情,等事情发生的时候我会主动通知你,然后你再作相应的处理。这样可以就可以把你解放出来,你只关注于处理好相应事件即可。采用事件驱动有什么优势呢?相对于常见的多进程编程,能更好的利用CPU资源。多进程编程会使进程数量变多,进程上下文切换频繁会增加系统压力,浪费宝贵的CPU资源。相对于多线程编程而言,可以降低编程复杂度。开发者不必再考虑线程间资源共享导致资源竞争等问题。

ReactPHP和Node.js都采用了事件驱动和非阻塞IO。从官方主页的宣传语上就可以得到印证。在Node.js的官网上有一段话:

Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient。

上面的意思是,Node.js使用事件驱动和非阻塞IO模型,以保证轻量级和高效。

在ReactPHP官网也有一段话:

Event-driven, non-blocking I/O with PHP.

上面的意思是,ReactPHP使用PHP语言实现了事件驱动和非阻塞。

ReactPHP和Node.js在实现事件驱动机制时也有相似之处。在事件的监听上,ReactPHP和Node.js都使用了libev库,但是也都是不只使用libev库。由于libev对windows支持不够好。因此,Node.js中封装了一层libuv。libuv是基于windows的IOCP和*nix的libev进行封装。而ReactPHP除了使用libev库外,还是用了其他的库。如,libevent。

ReactPHP和Node.js都各自有自己的生态圈。在各自生态圈中的一些模块一般都采用了事件驱动,异步编程的风格。如,ReactPHP的Stream模块,提供了以下几个事件:drain、error、close、pipe、end、data。相应的,在Node.js中也有一些类似的事件。Node.js的Net模,其中的net.Socket对象就有以下事件:connect、data、end、timeout、drain、error、close等。这样,开发人员只需要知道自己关注那些事件,并在这些事件上注册回调函数。等事件发生的时候,会主动执行这些注册的回调函数。这些回调函数都是异步执行的,这些函数虽然在注册的时候有先后顺序,但是在执行的时候是无序的,随机的,执行顺序和事件发生顺序相关。事件驱动再加上非阻塞IO,就可以极大的利用系统资源,代码无需阻塞等待资源可用。

单进程单线程

ReactPHP和Node.js一样都是采用了单进程和单线程的运行方式。单进程,单线程方式,没有多线程的资源抢占和上下文切换,高效率的运行,维护着一个事件队列。这种运行方式,通常情况下瓶颈一般在CPU而不是内存。由于单进程,单线程只能在一个CPU上运行,本身不能充分利用多个CPU资源。为了解决这个问题,我们可以启动多个进程,监听不同的端口,前端使用nginx等做代理,把请求分发到不同的进程上。对于多进程的管理上,现在已经有不少开源项目可以实现。如,php-pm

ReactPHP性能压测

相对于传统的nginx+php-fpm方式,ReactPHP的性能表现如何呢?现在我们来做下性能压测。服务器环境如下:

  • 8核CPU
  • PHP版本为5.5.15,使用opcache扩展
  • 操作系统为Centos5
  • Nginx版本为nginx/1.2.9
  • ReactPHP版本为0.4

为了公平起见,我们php-fpm和ReactPHP都只启动一个进程。压测工具我们使用ab,Apache开源的http服务压测工具。我们压测分两种情况来进行:第一种情况是只输出简单的Hello World。第二种情况只进行一次简单的sql语句查询,select 1 as num。

第一种情况:Hello World的压测结果如下,QPS:

第二种情况:SQL查询的压测结果如下,QPS:

可见,对于cpu密集型的应用,nginx+php-fpm的方式要比ReactPHP有更好的表现。但是对于数据库查询这样涉及网络IO的场景,ReactPHP的性能要远远好于nginx+php-fpm的方式。 

ReactPHP的应用场景

根据上面的测试,ReactPHP更适合IO密集型的应用。以下是ReactpHP比较适合的应用场景。

  1. 从RESTful API获取数据,并进行拼装输出只是请求api获取数据,然后进行简单的拼装,最后输出到客户端。本身业务逻辑不复杂。在请求的时候,可以同时对多个api进行请求,相对于顺序调用api的方式,会节省很多的时间,大大提高了响应的效率。
  2. 实时推送,在线聊天实时推送和在线聊天都需要维护大量的链接。这个正是ReactpHP擅长的。他可以很轻松的维护上万的链接。
  3. 分布式IO系统如一个数据库中间件层,它需要解析SQL为多条子SQL,然后把子SQL分发到不同的服务器查询数据,然后合并数据返回给客户端。这种情况下可以使用ReactPHP同时对多个数据库服务器进行查询。

如何使用ReactPHP 

ReactPHP可以使用composer安装,这个也是官方推荐的安装方式。首先安装composer。


  1. curl -s https://getcomposer.org/installer| php

安装完成后,会在当前目录下生成一个composer.phar文件。然后我们使用composer.phar安装react。


  1. php ./composer.phar require react/react

安装成功后,会在当前目录下生成一个vendor目录。下载的程序就在这个目录下。现在你就可以使用ReactPHP写程序了。例如,我们想提供一个http服务,我们将把客户端通过data参数提交的数据加上www.后进行返回。代码如下: 


  1. <?php
  2. require 'vendor/autoload.php';
  3. $port = $argv[1];
  4. $app = function ($request, $response) {
  5. $response->writeHead(200, array('Content-Type' => 'text/plain'));
  6. $query = $request->getQuery();
  7. $data = isset($query["data"]) ? $query["data"] : "";
  8. $response->end("www.{$data}\n");
  9. };
  10. $loop = React\EventLoop\Factory::create();
  11. $socket = new React\Socket\Server($loop);
  12. $http = new React\Http\Server($socket, $loop);
  13. $http->on('request', $app);
  14. $socket->listen($port, '0.0.0.0');
  15. $loop->run();
  16. ?> 

把上面的代码保持为文件reactphp.php。然后启动服务:


  1. php ./reactphp.php 5501

最后,我们验证下效果,可以通过下面的方式访问。 


  1. $curl  http://10.101.80.141:5501/?data=bo56.com
  2. www.bo56.com 

ReactPHP也有自己的生态圈。如进行异步mysql查询的react-php。

小结

ReactPHP作为Node.js的PHP版本。在实现思路,使用方法,应用场景上的确有很多相似之处。但是ReactPHP毕竟比Node.js年轻,目前生态圈还是不如Node.js完善。目前文档也不是很完善,在国内应用也比较少。但是相信,它会越来越完善,应用越来越广。

本文来自合作伙伴“Linux中国”,原文发布日期:2015-10-17

时间: 2024-08-04 07:42:32

ReactPHP:PHP版的Node.js的相关文章

ReactPHP,PHP版的Node.js

前言 前段时间csdn找我约稿.一直忙于项目,也没来及写.十一的时候,学习了下ReactPHP.把了解的一些东西整理成文.难免有疏漏,如发现请指正.原文已经发布到csdn.网址 http://www.csdn.net/article/2015-10-12/2825887 从名字说起 虽然ReactPHP项目已经发展了有4年之久,但是对于其称呼显得有点混乱.在开源中国为其建立的项目主页上,其被命名为React,或者node.PHP.国外的一些的博客谈及这个项目时,多数使用的是ReactPHP.到底

浅谈 Node.js 和 PHP 进程管理

所周知,PHP 占据了服务端编程语言的半壁江山,正如汪峰在音乐圈的地位一般.随着 Node.js 逐渐走上服务端编程的舞台,关于 PHP 和 Node.js 孰优孰劣的争论也不曾间断. 垄断性的市场份额足以佐证 PHP 的优秀.并且 HHVM 虚拟机.PHP 7 的革新,也给 PHP 带来了跨越式的性能突破.然而,当我们为语言层面的性能差异喋喋不休时,却往往忽略了 Web 模型在性能表现中的权重. 从 CGI 到 FastCGI 早期的 Web 服务,是基于传统的 CGI 协议实现的.每个发送到

【软件周刊第 31 期】Node.js 发布 v8.0.0 正式版;Qt 5.9 正式发布,长期支持版本

摘要: 软件周刊(05.28 - 06.03):本周热门软件更新 - Node.js 发布 v8.0.0 正式版:npm v5.0.0 正式发布,改进了稳定性:Qt 5.9 正式发布,长期支持版本:Dotty 0.1.2-RC1 发布,Scala 的下一代编译器:Linux Mint 18.2 Sonya 将于 6 月上旬发布公测版本 Node.js 发布 v8.0.0 正式版 新版带来了一系列重大的变化和新功能,Node.js v8 将在 2017 年 10 月进入长期支持(LTS)版本阶段.

windows系统下node.js环境配置与安装教程图文详解(详细版)_win服务器

国内目前关注最高,维护最好的一个关于nodejs的网站应该是http://www.cnodejs.org/ windows系统下简单nodejs环境配置. 第一步:下载安装文件 下载地址:官网https://nodejs.org/en/download/ 这里用的是 第二步:安装nodejs 下载完成之后,双击 node-v6.9.1-x64.msi,开始安装nodejs,默认是安装在C:\Program Files\nodejs下面 第三步:安装相关环境 打开C:\Program Files\

PHP 和 Node.js 的10项对比挑战

在最近 SitePoint 的 PHP vs Node.js Smackdown 一文中,Craig Buckler 对两种语言就如何应对一系列的10个挑战进行了比较来决定哪一个总体上更佳. Craig 在书中讲到,这些比较总是有些矛盾.作为一个有意思的随访,我们要求 Bruno Škvorc (SitePoint 的 PHP 开发者)和 James Hibbard (SitePoint 的一个 JavaScript 开发者)对每一轮提供评论. 下面是他们详细的看法- 第一轮:开始 Round

node.js学习笔记(9) 和谐模式

众所周知,ECMAScript 是一种开放的.国际上广为接受的脚本语言规范. 它本身并不是一种脚本语言.正如在 Web 应用程序中执行有用操作的 bean 集合(例如,Netscape 的 AWT)是 Sun 的 JavaBean 规范的一种实现一样,JavaScript 是 ECMAScript 规范的一种实现. 2015年6月17日,ECMA国际发布了EcmaScript2015,即EcmaScript6(以下简称ES6)草案的正式版.ES6是继ES5之后的一次主要改进,语言规范由ES5.1

JavaScript资源:前端和后端的Node.js

文章简介:JavaScript开发者值得收藏的7个资源.  Web 开发者通常会期望自己在 Web 领域的方方面面都是专业级别的人物,JavaScript 开发者也不例外.几年前 JavaScript 似乎还不是那么流行,但现在 JavaScript 可以说是 Web 开发界的"上等公民"了,关于 JavaScript 的资源也大量出现. 我最近一直在用 JavaScript,包括前端和后端的 Node.js.因此想和大家分享一些 JavaScript 库.项目和一般参考的资源,这些资

基于Node.js的自动化构建工具Grunt.js

Java世界里的Maven提供了强大的包依赖管理和构建生命周期管理.在JavaScript的世界 里,随着Node.js的流行,JavaScript原生的构建工具已经成为可能. Grunt.js是基 于Node.js的自动化任务运行器.Grunt.js结合NPM的包依赖管理,完全可以媲美Maven. Grunt.js天然适合前端应用程序的构建--不仅限于JavaScript项目,同样可以用于其他语 言的应用程序构建.越来越多的JavaScript项目已经在使用Grunt,其中最大的使用者包括著

深入浅出node.js游戏服务器开发:基于Pomelo的MMO RPG开发

在上一篇文章中,我们介绍了如何使用Pomelo来搭建聊天服务器.在这篇文章中,我们为大家介绍 如何使用Pomelo框架来搭建MMO RPG服务器,并分析其设计思路和实现方法.以此来帮助大家更好的理 解和使用Pomelo框架,理解Pomelo框架游戏开发的基础流程,使用方法和设计理念. 本文中的游戏服务端架构,只是为了说明Pomelo的开发理念和设计思路,并不是基于Pomelo开发的 唯一方案,开发者完全可以根据自己的实际应用环境设计不同的服务端架构. 开始之前 Pomelo框架与MMO RPG