PHP in the Command Line

PHP in the Command Line

by: Robert Plank

Thereกs a single line you can add to your web hostกs control panel that will automatically archive your content.

LISTEN CLOSELY AND YOUกLL HEAR THE OCEAN

Ever run commands in DOS? Youกve used a shell. A กshellก in the computer world is a place where you enter commands and run files by name rather than clicking around different windows.

Most web hosts let you operate a shell remotely. This means that you can type commands in window on your computer, that are actually run on your web host, thousands of miles away.

Iกd like you to log in to your shell now. If you can’t do it by going in to DOS and typing ‘telnet your.domain.hereก, your web host probably uses กSSHก a secure shell. Youกll have to ask your host how you can log in to the shell, they might tell you to download a program called กPuTTYก and give instructions how to use it.

If you can’t login to your shell, or aren’t allowed, youกll just have to sit back and watch what I do.

Now that you’re logged in, type: echo hi

On the next line will be printed hi

Try this: date +%Y

This prints the current year. Thatกs 2004 for me.

So what if we combined the two? Try: echo date +%Y

Well, that doesn’t work, because the computer thinks you’re trying to echo the TEXT กdate +%Yก instead of the actual COMMAND. What we have to do here is surround that text in what are called กback quotesก. Unix will evaluate everything enclosed in back quotes (by evaluate, I mean itกll treat that text as if it were entered as a command.)

Your back quotes key should be located on the upperleft corner of your keyboard, under the Esc button.

PIPE DOWN, OVER THERE…

Type this in: echo `date +%Y`

Gives us ก2004ก. You could even do something like this: echo `dir`

Which puts the directory listing all on one line.

But now, we put our newfound knowledge to good use. Unix has another neat feature called piping, which means ‘take everything you would normally output to the screen here, and shove it whatever file I tell you to.ก So say I had something like this:

echo กheyก > test.txt

Now type กdirก and youกll see a new file, test.txt, that wasn’t there before. View it off the web, or FTP it to your computer, do whatever you have to, to read the file. It should contain the word กheyก.

Likewise, dir > test.txt would store the directory listing into ‘test.txtก.

HERE TODAY, GONE TOMORROW

But say we wanted that text file to be named according to the current date. You already have the pieces to figure all that out, if you think about it. Type: date help to get a listing of all the possible ways to represent the date. The ones you want to represent the year, month and day are %Y, %m, and %d (capitalization *is* important here).

This is what you want: echo `date +%Y%m%d.html`

Running this today, January 8th, 2004, results in: 20040108.html

Iกve just echoed this year, followed by this month and this day, with an ก.htmlก at the end. This will be our output file.

Now, to pipe it: echo กheyก > `date +%Y%m%d.html`

If this sort of thing were to run every day, it would save กheyก to a file called 20040108.html today, and tomorrow to a file called 20040109.html, then 20040110.html, and so on.

The easy part now, is figuring out what you want archived. I use wget, which takes an option to store the output file, so we don’t need to use piping. Hereกs an example of how to use wget to save the page กhttp://www.google.comก to a file representing todayกs date:

wget http://www.google.com outputdocument=`date +%Y%m%d.html`

PUT IT TOGETHER

And now, to setup your crontab. I won’t explain how crontabs work, just that they’re the equivalent of the Windows Task Scheduler, which automatically run a particular command at a given date and time. The following will save http://www.google.com to a different filename every day.

0 0 * * * wget http://www.google.com outputdocument=`date +%Y%m%d.html` > /dev/null

Keep in mind that if you want to put it in a special directory, just put the path in, i.e. change whatกs in the กoutput documentก parameter to: `date +/home/user/wwwroot/your.host/%Y%m%d.html`

Iกve piped the output to /dev/null because wget saves the file for us, and thereกs no reason to do anything else with the output.

Tip: Pipe your cron jobs to /dev/null if you aren’t doing anything with the output, because some hosts email you the results and no one needs an extra piece of useless email every day.

Just change http://www.google.com to the page of your choice. However itกs important to know that the กarchiveก you’re taking will only be a snapshot of that page on a particular day.

What I mean by that is, if you’re archiving a blog page every day, this archiver won’t archive that page on a particular day, itกll just be archiving what was there at that time. So itกs not useful for everything, but itกs good if you have access to a page that changes constantly, once a day, whose results youกd like to store.

Add that line above into your crontab file. These days every host has a control panel so there should be a place in there to add cron jobs. If youกd like the archiver to run at a time other than midnight, or if it should run weekly, monthly, or whatever, try this tool Iกve made for you:

http://www.robertplank.com/cron

Iกve designed it the same way Task Scheduler is setup, you can enter a certain time, run only on weekdays, run only on certain days of the week. Anything you want.

This tip doesn’t take care of everything… for example, wget won’t save the images on a page unless they’re referenced by full URLs. In the next installment of this article series Iกll be showing you how you can use PHP to make up for some of the things wget can’t do (like grabbing images).

Hereกs my solution: http://www.jumpx.com/tutorials/commandline/get.zip

Itกs not the most perfect script in the world, but it should do what you want most of the time. If youกd like to delve into what it does, Iกve added comments within so you can see what it does. Iกve commented all the functions and a few of the important parts of the code.

ARGUMENTS (NOT THE SHOUTING KIND)

But wait, you want to use it in a crontab, which is run from the command line. You can’t just do something like:

php get.php?url=http://www.google.com

Because itกll try looking for a *file* named all that, complete with the question mark and all. So what if you have ten different URLs to grab off ten different crontabs, but you only want one script.

How would you do all that? Itกs a long brutal ordeal so prepare yourself. Ready?

php get.php url=http://www.google.com

Yeah, thatกs all there is to it. PHPกs pretty cool like that, it takes the arguments after the file name and stores them in the same array youกd check anyway.

One thing you might notice is that every time you run PHP from the command line, it gives you something like this:

Contenttype: text/html

XPoweredBy: PHP/4.3.3

your output here…

Those first couple of lines are the HTTP headers. But we’re not using HTTP (not loading it from a browser), so in the command line itกs better to call php with the กqก option, like this:

php q get.php url=http://www.google.com

The กqก stands for quiet, and will refrain from giving you the HTTP headers. If you’re just piping the script to /dev/null (to nothing) in a crontab, it doesn’t really make a difference but you should try to make this a habit when running PHP from the command line.

Thatกs enough for you to at least get started. If you still feel liking poking about with the things PHP can do in the command line, you can try prompting a user for keyboard input, like this:

Remember, that only works when PHP is run from the shell.

If you have PHP installed in Windows on a local machine of yours, you can also see what happens when you try to read (and write) to filehandles like กCOM1:ก and กLPT1:ก … yep, you guessed it, the serial port and printer port. If PHP isn’t installed on the computer you’re using now then don’t bother. But it is possible to use PHP to print and interact with your peripherals as well.

You’re welcome.

About The Author

Robert Plank is the creator of Lightning Track, Redirect Pro, Rotatorblaze, and others.

An easy way to display the content saved by this articleกs script is explained in chapters 15 and 16 of his book, กSimple PHPก: http://www.simplephp.com

You may reprint this article in full in your newsletter or web site.

This article was posted on January 12, 2004

by Robert Plank