It’s not uncommon to find hosting that cripples PHP by disabling the very handy
system() functions (which let you have the underlying operating system execute a program, doing different things with the output). If you use Perl, you’ll be able use
system(), or backticks or
qx// to your heart’s delight, but because PHP makes it easy to disable the common functions that let you get to the OS, people do.
Luckily, they quite often miss a little something:
popen() is a lovely function that opens a pipe to a process created by forking the command you pass as an argument. (That explanation may well be why they miss it, or decide that anyone using it knows enough not to destroy the world.)
You get back a file pointer, just like if you had used
fopen(), on which you either
fwrite() (or whatever your favorite way of dealing with files may be). You don’t get both: it’s either read or write, but for my purposes writing’s usually something for the command line, and reading’s all I need.
So, what can you do with it? Say you’ve installed the Feed Validator, and you want to use the included demo.py to check a feed from PHP:
<?php $feed = 'http://philringnalda.com/index.atom'; $handle = popen("python ~/rssvalidator/src/demo.py $feed 2>&1", 'r'); $read = fread($handle, 2096); // if (!strstr($read,'No errors or warnings') die("Oopsie!"); echo $read; pclose($handle); ?>
Or, suppose you wonder how you are doing at delivering
304 Not Modified for your RSS, but don’t feel like writing a whole log file parser in PHP? (I stole this from a comment by Abe Fettig: makes me wish I hadn’t fallen asleep every day in CLI Class)
<?php $command = 'grep "GET .*xml" ~/logs/philringnalda.com/http/access.log ' . '| cut -d ' ' -f 9 | sort | uniq -c'; $handle = popen($command, 'r'); echo fread($handle, 2096); pclose($handle); ?>