Веб хөгжүүлж байхад заримдаа статистик тооцоо хийх хэрэгцээ шаардлага тулгардаг. Тэгвэл 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 гэсэн хэрэглэгчдийн нэрийг зохих нэрсээр солихыг анхаарна уу.