Integrating PHP and R
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
“How can I integrate PHP and R?”
I know I’m not the only one who’s asked this question. After all, with great content management systems like Drupal, it would very cool to be able to drop an R module into some PHP code and instantly have a web app popping out some snazzy looking ggplot graphics. After spending some time Google searching for an easy implementation and finding very little in the PHP + R space, I was able to piece together a method for integrating the two. It uses no JavaScript… no AJAX… just plain old PHP.
The poor man’s R web app
Disclaimer: There are many reasons why you shouldn’t actually stick the following code on the web for all to see. It is a very stripped down example, which is great for experimenting on a localhost, but has some serious security flaws.
This implementation of PHP and R consists of only two files. One written in PHP, and the other an R script. The PHP returns a form which uses the GET method to send a variable N to the server. When the form is submitted, the PHP will then execute an R script from the shell using a combination of the PHP command exec()
and the Rscript
shell command. This command will pass the variable N to the R script. The R script will then execute and save a histogram plot of N normally distributed values to the filesystem. Finally, when the R script is complete, the PHP will return the HTML tag containing the saved images path. First, the PHP file…
<?php // poorman.php echo "<form action="https://r-bloggers.com/phplist/?p=subscribe&id=1" method="post" target="popupwindow">"; echo "Number values to generate: <input type='text' name='N' />"; echo "<input type='submit' />"; echo "</form>"; if(isset($_GET['N'])) { $N = $_GET['N']; // execute R script from shell // this will save a plot at temp.png to the filesystem exec("Rscript my_rscript.R $N"); // return image tag $nocache = rand(); echo("<img src='temp.png?$nocache' />"); } ?>
and the R script…
# my_rscript.R args <- commandArgs(TRUE) N <- args[1] x <- rnorm(N,0,1) png(filename="temp.png", width=500, height=500) hist(x, col="lightblue") dev.off()
Finally, to help you visualize the whole process a bit better, below is a screenshot of the results…
Some Issues
This is a very simple example that works fine on a localhost, but there are some BIG issues that need to be resolved before this code is opened up to the web.
- The user input isn’t sanitized
- Only one user can be using this web app at a time
- More care needs to be taken with read/write access
- More care needs to be taken with the relative file paths
- Speed?
- … and I’m sure I’m missing many more
The bottom line is that with less than 20 lines of code we are able to generate R graphics in a browser… everything else is just details.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.