たとえば、
・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
・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