ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

PHPからRを呼び出して、処理させる方法

2017-10-25 16:16:55 | AI・BigData
たとえば、
・DBからデータを抽出して、
・Rで処理して、
・その結果をREST APIで出力する
というプログラムをPHPで書きたいことがあるかもしれない。

たとえば、Redmineのデータベースの中に入っているチケット
(issuesテーブルにはいっている)のチケットのうち、バグの
ものに対して、S字曲線を書いた図を表示したいなどという場合。

Rでの方法は、

バグのS字曲線とかを、Rを使って求める(ただし、正確ではない)
http://blog.goo.ne.jp/xmldtp/e/b062f8a684870cabb7ffa3cae3d74d17


に書いたけど、これをPHPで呼び出す方法について




■概要
RServerを利用する。クライアントは、rserve-phpを使う。
具体的には、以下の手順
・サーバーにRserveを入れる
・クライアント(PHP側)にrserve-php を入れ、PHP.iniの書き換え
・プログラムを書く
以下、詳細な手順。




■サーバーにRserveを入れる

(1)インストールしていなかったら、Rをインストールする
 ダウンロード元
   https://cran.r-project.org/
 Windowsの場合、次の画面にいったら、上の文中にあるリンク
   install R for the first time.
 をクリック。次の画面になったら、あとは解ると思う(英語がわからなくても)

 ダウンロードしたら、インストールする

(2)Rを起動する
 出てきたコンソール画面で
 install.packages("Rserve")
 と入力、どこか選ぶので、Japanとか選べば、ダウンロードする

(3)環境設定 R.exeと打てば、コンソール上で実行できるようにする。
 たとえば、RがC:\Program Files\R\R-3.1.1にいるなら、

 32ビットの場合
  C:\Program Files\R\R-3.1.1\bin
 64ビットの場合
  C:\Program Files\R\R-3.1.1\bin\x64
 を、環境定数のPATHに追加する
 (コントロールパネル→システム→システムの詳細設定→環境定数)

 →注意:32ビットと64ビットでは、参照するパスが違うので注意!
 まちがえると、(4)実行時、「指定されたパスが見つかりません」みたいなエラー
 になる

(4)上記(3)でパスを通したのち、コマンドプロンプトから
 ECHO library(Rserve);Rserve() | R.exe --slave
 を実行する。なんかメッセージがでてくる

(5)起動時に上記コマンドを毎回行わないといけないので、
 自動化したかったら、適当に自動化する。




■クライアント(PHP側)にrserve-php を入れ、PHP.iniの書き換え

(6)rserve-phpをダウンロードし、解凍する
 https://code.google.com/p/rserve-php/downloads/list
 にある。上のほう。zipファイルなので、解凍

(7)PHPで見えるようにする
 解凍したものを、htdocsの下におくかんじ。
 自分の場合は、解凍したものをrserve-phpフォルダの中に入れ、このフォルダを
 htdocsの下においている(あとで、この中をrequireする)

(8)php.iniの書き換え
 RとPHPで通信するときにsocketを使うので、php_socketsを使えるようにする
 具体的にはphp.iniの中、
 ;extension=php_sockets.dll
 のコメント(;)をはずし
  extension=php_sockets.dll
 にして「サーバー再起動する!」
(しないと、意味ない。socketでエラーになったことが、エラーログに書かれる)




■プログラムを書く

・Connection.phpをrequireする
・Rserve_ConnectionをNewして、コネクションを得る
・コネクションのevalStringを実行する(引数にRの処理内容を書く)

サンプルは、こんなかんじ
(注意 全角< >は本当は半角の< >なので、ちゃんと置き換えること)

<?php

require "rserve-php/Connection.php";

try
{
    $cnx = new Rserve_Connection("127.0.0.1");

    $cmd = "";
    $cmd = $cmd . "T<-c(1,2,3,4,5,6,7,8,9)\n";
    $cmd = $cmd . "F<-c(52,91,92,129,177,199,224,264,286)\n";
    $cmd = $cmd . "d<-data.frame(t=T,f=F)\n";
    $cmd = $cmd . "m1<- nls(f ~ a1*(1-exp(-b1*t)), data=d, start=list(a1=30,b1=0.4)) \n";
    $cmd = $cmd . "summary(m1) \n";

    $result = $cnx->evalString($cmd);

    $cnx->close();


} catch (Exception $e) {

    $result = $e->getMessage();

}
?>

<?= $result ?>




【参考サイト】
Rserveでサーバ化
http://kenpg.seesaa.net/article/358145237.html

この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 途中まで絵を書くと、続きを... | トップ | 「ベンダーのプロジェクト管... »
最新の画像もっと見る

AI・BigData」カテゴリの最新記事