PHP дээрээс R хэл дээрх код ажиллуулах
PHP дээрээс R програмтай холбогдож R хэл дээр бичсэн код ажиллуулах, үр дүнг нь буцаан хүлээж авах тухай товч заавар болон жишээ код
Веб хөгжүүлж байхад заримдаа статистик тооцоо хийх хэрэгцээ шаардлага тулгардаг. Тэгвэл PHP хэл дээр веб хөгжүүлэгчид нарийн төвөгтэй статистик тооцоог R програм ашиглаж гүйцэтгүүлээд гарсан үр дүнг нь эргүүлээд PHP код дотроо оруулж ирээд ашиглах боломжтой. Ингээд PHP хэлний exec()
болон shell_exec()
функц ашиглаж үүнийг хэрхэн хийж болохыг харуулъя.
Бэлтгэл ажил Веб серверээ зохих ёсоор бэлдсэн байна. Тухайлбал Apache эсвэл Nginx бас PHP суулгаж тохируулсан байна. Мөн R програм суулгасан байх шаардлагатай.
Файл үүсгэх Веб серверийнхээ зохих хавтас дотор "index.php" болон "r-code.R" файл үүсгэнэ.
PHP файлын агуулга "index.php" файлд дараах код бичиж хадгална.
<html>
<head>
<title>PHP ба R</title>
</head>
<body>
<form action="" method="get">
<span>Санамсаргүй түүврийн хэмжээ</span>
<input type="number" name="sample-size" min="1" max="1000" value="100">
<button type="submit">Илгээх</button>
</form>
<?php
if (isset($_GET["sample-size"])) {
$sample_size = intval($_GET["sample-size"]);
$output = shell_exec("Rscript r-code.R $sample_size");
$output = str_replace("\n", '<br />', $output);
echo $output;
}
?>
</body>
</html>
Код ажиллахдаа R програмд "r-code.R" файл дахь кодыг ажиллуулах тушаал өгч байна. Мөн ингэхдээ хэрэглэгчийн илгээсэн формоос ялгаж авсан $sample_size хувьсагчийн утгыг аргумент болгон R програмд дамжуулж байна. PHP хэлний shell_exec()
функц дуудан ажиллуулж буй програмын буцаасан бүх үр дүн буюу тэмдэгт мөрүүдийг цуглуулж авдаг бол харин exec()
функц зөвхөн хамгийн сүүлийн тэмдэгт мөрийг л авдаг.
R файлын агуулга "r-code.R" файлд дараах код бичиж хадгална.
command.line.arguments <- commandArgs(trailingOnly = TRUE)
sample.size <- as.integer(command.line.arguments[1])
print(sample.size)
X <- stats::rnorm(sample.size)
print(X)
R програмд дамжуулсан аргументыг commandArgs()
функцийн тусламжтай гарган авч болдог. sample.size
болон X
объектуудыг хэвлэхэд гарах үр дүн буюу тэмдэгт мөрүүдийг PHP дээр хүлээн авахдаа shell_exec()
функц ашигласан.
Бусад нэмэлт зүйлс Дээрх тохиолдолд R дээр ямар нэг нэмэлт мэдээлэл (алдаа, анхууралга болон ердийн мэдэгдэл) гарсан үед түүнээс хойших үр дүнг үргэлжлүүлэн хүлээж авч чадахгүй. Харин R хэл дээрх кодоо тусад нь файл болгон хадгалмааргүй байвал кодоо тэмдэгт мөр байдлаар шууд дамжуулах боломжтой. Үүний тулд Rscript програмын -e аргумент ашиглана.
$output = shell_exec("Rscript -e 'X <- stats::rnorm($sample_size); print(X)'");
Rscript гэсний оронд R гэж дуудаж болох бөгөөд R програм ажиллаж эхлэхэд гардаг мэдээлэл (програмын хувилбар, лицензийн мэдээлэл зэрэг) нэмж гардагаараа л ялгаатай. Гэвч энэ тохиолдолд -q
зэрэг агумент нэмж дамжуулах замаар тэрхүү мэдээллийг хорьж болдог.
Бас тодорхой нэг хэрэглэгчийн суулгасан R програмын нэмэлт багц ашиглах шаардлага тулгардаг. Тийм үед PHP дээрээс sudo -u username
угтвар бүхий тушаал өгнө.
shell_exec("sudo -u galaa Rscript r-code.R '{"json":"data","key":"value"}'");
Энэ тохиолдолд Rscript програм уруу нууц үггүй хандах боломж нээсэн байх хэрэгтэй. Үүний тулд sudo visudo
тушаалаар нээгдэх файлд дараах байдалтай мөрүүдийг нэмж хадгална.
galaa ALL=(ALL) NOPASSWD: /usr/bin/Rscript
www-data ALL=(ALL) NOPASSWD: /usr/bin/Rscript
Энд galaa болон www-data гэсэн хэрэглэгчдийн нэрийг зохих нэрсээр солихыг анхаарна уу.