一个以R语言为核心的PHP-MySQL计算服务器架构

    数据分析 yeakyang 65次浏览 0个评论 扫描二维码

    信息时代来临,将信息的爆发如何转化为知识的爆发这一难题使得大数据得以大行其道。随之而火的小众语言R语言也随之“鸡犬升天”。R语言素来被认为是在统计、计算、数据挖掘等方面具有很强的实用性,广泛用于生物、金融、网络媒体等多个领域。在用R语言构建了计算脚本后,如何将其进行推广,为更多的人提供服务呢?比如,公司的数据分析部门,如何将已建立的R语言计算模型提供给公司其他不懂计算机程序和统计分析的同事使用呢?我的建议是建立一个基于web的服务器,在后端使用R语言提供服务,前段提供用户友好的foolproof页面。那么问题来了,如何将R语言和web进行连接和数据传输? 

    我的建议是使用PHP+Rserve+Mysql框架来完成这一伟大的想法。这也正是我要跟大家介绍的内容。在这个框架中你可能需要了解的语言有:html、PHP、R语言、sql查询语言、简单的shell脚本。初步了解这些语言是搭架这样一个计算服务器的前提。

    一个以R语言为核心的PHP-MySQL计算服务器架构

    首先我们来看一下这个框架的整体结构:这个框架是基于Linux操作系统的,当然有条件的、对windows从操作系统熟悉的可以尝试使用windows平台,我作为一个宣称无Linux无科研的Linux爱好者,我显然会跟大家首推Linux。后端使用PHP来生成html页面,完成一个常规网站所需要的所有工作,包括登陆、用户管理、数据库连接等工作,因为我不是一个正儿八经的PHP工程师,我也就不在这里班门弄斧了。后端最重要的核心,也是我们业务中最卖钱的计算脚本:R语言,我就不在这里进行详细的介绍了,我会在后面对具体在R语言中药使用哪些R包进行介绍。

    后端还有一个核心,那就是MariaDB,这里需要跟大家声明一下,之前我说的是MySQL,那这里为什么又说是MariaDB,其实了解两者背景的就不会奇怪了。MariaDB是MySQL的一个分支,在MySQL被甲骨文收购以后,MySQL存在被甲骨文闭源的风险,因此开源社区采用分支的方式来避开这个风险。所以在我使用的Fedora20发行版本中仍然使用的是MySQL的命令来进行管理。MariaDB也是对MySQL兼容的。

    一个以R语言为核心的PHP-MySQL计算服务器架构

    我们可以打一个的比喻:PHP和R语言是一个团队的两个成员,他们各具特点:R语言这个人比较学究气,在学术研究、专业性操作方面很擅长,也很有效率,但是因为与客户较少的交流,导致他不能顺畅的与客户进行沟通;而PHP这个人因为擅长于与客户沟通,因此扮演者与客户沟通角色;但是问题是R语言这个人和PHP这个人之间也只能进行少量的沟通,比如唤醒R语言这个人,仅此而已,不能进行再多一点的交流。于是团队需要另外一个优秀的人,那就是MariaDB,MariaDB其实比R语言和PHP这两个人都要更加内向(很少有用户会直接操作数据库,因为他们界面实在是太不友好了,而我们每天都在享受着数据库带来的便利:社交媒体等)。但是MariaDB这个人的好处在于他可以无障碍的在R语言和PHP这个人之间进行信息的传递。所以他们三个人之间的分工就很明确了,由PHP负责与前段进行沟通,生成用户友好的页面、帮助用户对用户的数据进行管理、引导用户执行系统的各项任务,最主要的任务是接受用户的指示,唤醒R语言。在唤醒R语言(步骤3,本段步骤见图2)之前,PHP已经将用户的信息传达给了MariaDB,MariaDB会把这些信息保存好(步骤2)。R语言被唤醒后,开始了他的高速旅程,他开始收集信息,首要信息就是用户传递来的信息,R语言会自觉的向MariaDB申请使用这些数据(步骤4)。与人类的故意刁难和恶意的内部竞争不同,MariaDB会将规范好的数据告诉R语言(步骤5)。R语言在对这些数据进行了计算和分析后(步骤6),会再次与MariaDB进行握手,将结果信息传递给MariaDB(步骤7),然后告诉PHP我的工作完成了(步骤8),结果你去找MariaDB。PHP会以示感谢(这一步其实是没有的),然后向MariaDB进行申请(步骤9),请求数据反馈给用户(步骤10)。当然在最后一步中,R语言可以在唤醒后脱离与PHP的关系,与MariaDB进行沟通,将自身的进展情况与MariaDB进行实时沟通,而PHP可以定时向MariaDB进行握手询问R语言的状态,这样可以建立一个实时的进度展示功能。

    PHP与R语言通信

    好了,在对结构整体进行了简单描述后我们再来看一下具体到每一个技术如何实现这些功能。在我开始这项工作的首要步骤就是建立起R语言和PHP的联系,而我使用的是rserve-PHP客户端(https://github.com/cturbelin/rserve-php )。其中Rserve可以提供基于TCP/IP协议或者unix scoket的为用户提供R语言功能调用的服务。那么在我们这里我们可以首先从CRAN安装Rserve,然后再进行简单的配置,具体操作可以参考http://blog.fens.me/r-rserve-server/ 。该文作者为大家提供了一个很好的Rserve的使用教程。下面我的Rserve配置文件和参照rstudio-serve启动脚本写的一个Rserve启动脚本(感谢rstudio团队),仅供大家参考。

    —————————————-以下是Rserve配置文件—————————-

     

    workdir /tmp/Rserv
    
    remote enable
    
    fileio enable
    
    interactive yes
    
    port 6311
    
    maxinbuf 262144
    
    encoding utf8
    
    control enable
    
    source /var/www/html/webadmin/yourscript.R

     

    —————————————-以上是Rserve配置文件—————————-

    这里的yourscript.R是你的核心代码。我的建议是核心代码里面尽量全部写成函数,这样方便后面用php进行调用,可以大量减少你的php代码,增加系统的稳定性。这也是Rserve开发者的建议:

    一个以R语言为核心的PHP-MySQL计算服务器架构

    上图是当初在初探这一方案可行性的时候给开发者写信求助后,开发者给我的回信,感谢他们无私的帮助。

    —————————————-以下是Rserve脚本—————————-

     

    #!/bin/bash
    
    #
    
    # description: Rserve server
    
    . /etc/rc.d/init.d/functions
    
     
    
    conf="/var/www/html/webadmin/Rserve.conf"
    
    prog="Rserve"
    
    start() {
    
    echo -n $"Starting Rserve: "
    
    R CMD Rserve --RS-conf $conf
    
    }
    
     
    
    stop() {
    
    echo -n $"Stopping Rserve: "
    
    killproc $prog
    
    }
    
     
    
    restart() {
    
    stop
    
    start
    
    }
    
     
    
    r_status() {
    
    status $prog
    
    }
    
     
    
    r_status_q() {
    
    r_status >/dev/null 2>&1
    
    }
    
     
    
    case "$1" in
    
    start)
    
    r_status_q && exit 0
    
    $1
    
    ;;
    
    stop)
    
    r_status_q || exit 0
    
    $1
    
    ;;
    
    restart)
    
    $1
    
    ;;
    
    status)
    
    r_status
    
    ;;
    
    *)
    
    echo $"Usage: $0 {start|stop|status|restart}"
    
    exit 2
    
    esac

     

    —————————————-以上是Rserve脚本—————————-

    Rserve脚本的用法是:

    Rserve start     启动Rserve服务器

    Rserve stop      停止Rserve服务器

    Rserve restart 重启Rserve服务器

    Rserve status  查看Rserve服务器运行状态

    那么到这里我们已经搭建起我们的Rserve服务了,在从https://github.com/cturbelin/rserve-php 下载了rserve-php的php代码后我们就可以开始使用我们的php唤起R语言了。下面举一个简单的例子:

    —————————————-以下是调用rserve-php的php文件—————————-

     

    require_once 'inc/config.php';
    
    require 'inc/Connection.php';
    
    $r = new Rserve_Connection(RSERVE_HOST);
    
    $cmd = "YourFunction(ParaA,ParaB)";
    
    $run = $r->evalString($cmd,Rserve_Connection::PARSER_NATIVE);

     

    —————————————-以上是调用rserve-php的php文件—————————-

    运行之前我们要先调用config.php和Connection.php两个文件,这两个文件提供了连接R语言的一些必要的函数。这里制作简单举例,有兴趣的可以自行挖掘详细用法,这里不做赘述。

    MariaDB与R语言通信

    事实上,MariaDB与R语言通信其实并不是一个难事,简单的说我们可以使用CRAN的RMySQL包。当然跟这个包类似的有RSQLite包,这个包是用来连接SQLite数据库的。下面举一个简单的例子:

    —————————————-以下是RMySQL代码—————————-

     

    con = dbConnect(MySQL(),user="username",password="passwd",dbname="DBname")
    
    query = paste("select * from TABLEname;")
    
    rs <- suppressWarnings(dbSendQuery(con, query))
    
    MySQLPara <- fetch(rs, n = 10000)
    
    dbDisconnect(con)

     

    —————————————-以上是RMySQL代码—————————-

    PHP与MariaDB连接

    PHP与数据库的连接其实是一个普遍应用的东西,我这里用的PDO库,在这里我也不跟大家详细描述如何连接了,大家简单的上百度搜索一下就会有很多人告诉如何使用这些东西了。


    喜欢 (1)
    发表我的评论
    取消评论
    表情 贴图 加粗 删除线 居中 斜体 签到

    Hi,您需要填写昵称和邮箱!

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址