[转]ReactPHP── PHP版的Node.js

FROM : http://www.csdn.net/article/2015-10-12/2825887

摘要:ReactPHP作为Node.js的PHP版本。在实现思路,使用方法,应用场景上的确有很多相似之处。但是ReactPHP毕竟比Node.js年轻,目前生态圈还是不如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(https://github.com/php-pm/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。

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

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

php ./composer.phar require react/react

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

<?php
require ‘vendor/autoload.php‘;

$port = $argv[1];

$app = function ($request, $response) {
        $response->writeHead(200, array(‘Content-Type‘ => ‘text/plain‘));
        $query = $request->getQuery();
        $data = isset($query["data"]) ? $query["data"] : "";
        $response->end("www.{$data}\n");
};

$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server($loop);
$http = new React\Http\Server($socket, $loop);

$http->on(‘request‘, $app);

$socket->listen($port, ‘0.0.0.0‘);
$loop->run();
?>

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

php ./reactphp.php 5501

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

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

www.bo56.com

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

小结

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

作者简介

信海龙,淘宝技术专家。2006年毕业于河北大学政法学院。之后,便踏上了互联网开发的不归路。目前已经有9年的互联网开发经验。2013年加入淘宝技术部,把工作中遇到的问题记录到博客(www.bo56.com)。同时也是多个开源项目的开发者和维护者。

时间: 2024-10-25 20:35:21

[转]ReactPHP── PHP版的Node.js的相关文章

在 Lubuntu 安装 Node.js

在 Ubuntu 下安装 Node.js sudo apt-get install python-software-properties python g++ make sudo add-apt-repository ppa:chris-lea/node.js sudo apt-get update sudo apt-get install nodejs 在 Cubieboard 上安装 Node.js 我的 Cubieboard 2 安装的是 Linaro 12.11,使用 Ubuntu 的安

谁才是性能之王?( Node.js vs io.js v2.0.0 )

我们注意到 io.js v2.0.0 RC 版公告中有些有趣的内容.这个社区版的 Node.js 同样基于 V8 引擎实现,而且主版本提交的频率远高于它的父项目(Node.js). 就 像我们之前提到的,之前我们热衷于用 Node.js 开发了 Raygun API,以确保在高负载情况下达到尽可能短的响应时间,给我们的用户提供最佳的服务.之前的一片博客比较了一下 Node.js 与 io.js的性能,后来 io.js V2 版本发布了,我们准备重温下不同情况下的性能测试. 配置 像 之前一样,下

阿里云ECS部署node.js及防火墙80端口开启

第一篇竟然是node.js在阿里云ECS上的部署遇到的小问题记录. 很多时候我们排除故障都会掉进小坑,但别小看是小坑,有时候挺烦人挺难缠的,主要还是基础知识匮乏导致思路混乱造成的,在这里记录下,给自己提个醒,也为网友指条明路,别像我一样乱折腾了. 环境描述: 1.阿里云ECS 单核.1G内存.1M带宽,基本就是最低配置了 2.阿里云提供的CentOS 6.5安全加固版 3.node.js 0.10.30 一,安装过程(尽量精简了,教程太多,不多说) #yum install gcc-c++ op

为什么我这个 Java 死忠倒向了 Node.js?

作为一个在Sun微系统公司Java SE团队工作了十多年的人,难道不应该是体内流淌着Java字节码的血.只要一息尚存就要不断实现抽象接口吗?但对于我这个前Java SE团队成员来说,2011年学习了Node.js平台后就像是呼吸到了新鲜空气一样--我在2009年1月被Sun裁退之后(正好在Oracle收购之前),开始学习Node.js并被它深深所吸引. 我是怎样被吸引的?从2010年起,我就开始写各种关于Node.js编程的东西了.具体来说,写了四版<Node.js Web开发>,加上一些其他

Node.js的安装与配置

一.下载和安装 1. 前往官网https://nodejs.org/或https://nodejs.org/en/download/下载最新推荐版的Node.js,本文使用10.13.0版本. 对于Windows系统,使用.msi安装文件是最简单的,也可以使用.zip进行绿色安装. 2. 如果使用.msi的话一路next就可以,安装文件会自动配置环境变量. 3. 使用.zip安装包安装. (1) 将压缩包解压到D:\Program Files\NodeJs目录下 (2) 配置环境变量 新建NOD

node.js 还没有发布一个正式版,核心团队已经另起炉灶

node.js核心团队中的4人(共5人)离开原团队,另起炉灶 io.js 异步IO回调语言开发,在开源历史上又一次成功证明一门活力四射技术但凡被商业公司包养,最后的下场都比较惨,就像之前的mysql ,其作者不认同oracle 公司的种种规定限制,从而另立炉灶开发了一款开源数据库一样. java的下场好吗? 被sun抛弃后转手嫁给了oracle !!! 历史如此巧合,包养node.js技术的公司貌似很快也面临被oracle 收购..... oracle 到底要搞成那样,还能不能一起愉快的玩耍了!

Practical Node.js (2018版) 第7章:Boosting Node.js and Mongoose

参考:(mongoose和mongodb模块的区别)https://www.jianshu.com/p/87bcf4fdb479 参考: mongoose官网(https://mongoosejs.com/docs/models.html) 参考: 英文:Boosting Node.js和MongoDB with Mongoose 简介:mongoose Mongoose is a fully developed object document mapping (ODM) library for

Node.js安装详细步骤教程(Windows版)

什么是Node.js? 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js是一个基于 Chrome V8 引擎的 JavaScript 运行环境: Node.js使用一个事件驱动.非阻塞式 I/O 的模型,使其轻量且高效: Node.js的软件包生态系统npm是全球最大的开源库生态系统. 安装教程 本机环境:Windows 7 旗舰版 64bit操作系统 1.下载安装包 Node.js 官方网站下载:https://nodejs.org/en/download/

Node.js 面试问题及答案(2017 版)

阅读原文 两年前,我们发布了我们的第一篇关于 Node.js 面试的文章 Node.js 面试常见问题和答案,近两年,JavaScript 和 Node.js 生态系统有了很多更新和发展,因此,是该更新这些面试问题和答案的时候了. 免责声明(重要) 仅仅通过面试问题去评价一个面试者,从来都不是一个好的选择.但是这些问题可以让你大体了解面试者在 Node.js 开发上的经验. 当然,这些问题并不能全面反映一个人的思维方式和开发习惯. 我相信,开发中遇到的问题,更能反映面试者的知识水平 - 所以,我