PHP 7.1.0 Release Candidate 3 Released

# system

(PHP 4, PHP 5, PHP 7)

systemExecute an external program and display the output

### Description

string system ( string $command [, int &$return_var ] )

system() is just like the C version of the function in that it executes the given command and outputs the result.

The system() call also tries to automatically flush the web server's output buffer after each line of output if PHP is running as a server module.

If you need to execute a command and have all the data from the command passed directly back without any interference, use the passthru() function.

### Parameters

command

The command that will be executed.

return_var

If the return_var argument is present, then the return status of the executed command will be written to this variable.

### Return Values

Returns the last line of the command output on success, and FALSE on failure.

### Examples

Example #1 system() example

 <?phpecho '<pre>';// Outputs all the result of shellcommand "ls", and returns// the last output line into $last_line. Stores the return value// of the shell command in$retval.$last_line = system('ls',$retval);// Printing additional infoecho '</pre><hr />Last line of the output: ' . $last_line . '<hr />Return value: ' .$retval;?> 

### Notes

Warning

When allowing user-supplied data to be passed to this function, use escapeshellarg() or escapeshellcmd() to ensure that users cannot trick the system into executing arbitrary commands.

Note:

If a program is started with this function, in order for it to continue running in the background, the output of the program must be redirected to a file or another output stream. Failing to do so will cause PHP to hang until the execution of the program ends.

Note: When safe mode is enabled, you can only execute files within the safe_mode_exec_dir. For practical reasons, it is currently not allowed to have .. components in the path to the executable.

Warning

With safe mode enabled, the command string is escaped with escapeshellcmd(). Thus, echo y | echo x becomes echo y \| echo x.

### User Contributed Notes 53 notes

40
no at mail dot com
4 years ago
 This is for WINDOWS users. I am running apache and I have been trying for hours now to capture the output of a command. I'd tried everything that is written here and then continued searching online with no luck at all. The output of the command was never captured. All I got was an empty array.Finally, I found a comment in a blog by a certain amazing guy that solved my problems. Adding the string ' 2>&1' to the command name finally returned the output!! This works in exec() as well as system() in PHP since it uses stream redirection to redirect the output to the correct place!system("yourCommandName 2>&1",$output) ;  d dot kraft at szo dot de 13 years ago  For PHP running inside a Webserver:When calling a process viasystem("your_process &");to make it running in background, note that this process is killed when the webserver is restarted.  vlad dot sharanhovich at gmail dot com 8 years ago  The double quote problem on Windows platform discussed earlier here in comments still present in PHP 5.2.5. You can't execute system($command) if $command contains more than 2 " chars. system('"echo" A'); works, while system('"echo" "A"'); does not. Search comment, that was a solution posted to overhaul this issue via temporary .bat file.  srawlinNOSPAM at magma dot ca 12 years ago  If you are running PHP in a chroot environment then the system (and passthru) function needs /bin/sh to be located in the chroot as well.  tomlubbock at hotmail dot com 12 years ago  If you need to run root-level commands, such as to reboot a service, the utility 'sudo' will let you handle linux permissions. In our example we use 'sudo' to allow apache temporary root access to restart a service. We can then use:system("sudo service dhcpd restart")You also need to examine the /etc/sudoers file to specify what permissions to grant. Hope this helps someone!  mortoray at ecircle-ag dot com 12 years ago  Do not use "system" if you use the "php.ini" option: zlib.output_compression = OnDoing so will result in the browser receiving garbage (I'm guessing the headers/buffers get confused).Use passthru in this case, it appears to work as intended.  tr4nc3 at msn dot com 12 years ago  I almost gave up trying to get Windows XP w/ Apache 2 to use either system(), or exec() to run a batch file.If the batch file was this...echo test > test.txtit would work fine, creating test.txt...but if the batch file was..iexplore.exe "http://www.ibm.com"I would get nothing. After hours and hours of messing around with this I figured it must be some type of permission problem. (dugh!)Long story a little shorter.. You have to give Apache permission to "interact with the desktop".Here's how...Start>Run>services.mscRight click "Apache...", select properties.Click on the "LOG ON" tabCheck the box "Allow this service to interact with desktop"Click OKRestart ApacheWorks great!:DHOPE THIS HELPS SOMEONE!Too bad I didn't find a post like this before I figured it out myself. (I could have been working on something.)  morris_hirsch at hotmail dot com 13 years ago  another reason to use shell_exec instead of system is when the result is multiple lines such as grep or ls <?php// this correctly sets answer string to all lines found//$answer = shell_exec ("grep 'set of color names' *.php ");//echo "answer = $answer";// this passes all lines to output (they show on page)// and sets answer string to the final line$sys = system ("grep 'set of color names' *.php "); echo "sys =(($sys))";?>here is view/source resulting from system callsetprefs.php:// The standard set of color names is:setprefs.php:// Most browsers accept a wider set of color namessilly.php: //$answer = shell_exec ("grep 'set of color names' *.php ");silly.php: $sys = system ("grep 'set of color names' *.php ");sys =((silly.php:$sys = system ("grep 'set of color names' *.php ");))and here is view source from using shell_exec insteadanswer = setprefs.php:// The standard set of color names is:setprefs.php:// Most browsers accept a wider set of color namessilly.php:  $answer = shell_exec ("grep 'set of color names' *.php ");silly.php://$sys = system ("grep 'set of color names' *.php "); 
Jim Belton
13 years ago
 To run a full screen program from a PHP CLI script, redirect input from and output to /dev/tty.  For example:system("timeconfig > /dev/tty < /dev/tty");System will wait for the program to finish before continuing. 
n-jones at fredesign dot net
14 years ago
 To have system output from both the STDERR and STDOUT, I've modified the function posted above by lowery@craiglowery.comfunction mysystem($command) { if (!($p=popen("($command)2>&1","r"))) { return 126; } while (!feof($p)) {    $line=fgets($p,1000);    $out .=$line;  }  pclose($p); return$out; }Now you can use mysystem() like;$var = "cat ".$file;echo mysystem($var);$catfile = mysystem($var);if (ereg("text",$catfile)) {  //stuff here;}N.Jones 
roger at proproject dot com
14 years ago
 For your in-house pages, I recommend redirecting stderr to stdout so you'll know if something goes wrong.  Here's a real-life example:system("/mysql_reboot 2>&1"); 
al at aj8 dot org
8 years ago
 In response to willytk at gmail dot com, 10-Sep-2007 01:39If imagemagick / convert from eps or pdf is not working because the gs executable is not in the apache path, you can compile imagemagick with  --with-frozenpathsThis makes imagemagick store the full path to the gs executable. The error I was getting before was"sh: gs: command not found"when convert was called with "-debug All"CheersAlastair Battrick 
nospam at php dot net
16 years ago
 If you are trying to parse a CGI script to your webserver which needs arguments, take a look to the virtual() function .. it took me long before i found out it existed... It's used like this: <?php virtual("/cgi-bin/lastuser.cgi?argument"); ?> And that works excellent now for me 
phil at pjhayward.net
11 years ago
 On Windows XP, (possibly others)If you are getting the unable to fork error, make sure the internet guest user has permission to read and execute the \Windows\System32\cmd.exe file. 
user at unknown dot com
13 years ago
 a simple way to include a beep on the server-side whenever a page in viewed.**contents of 'beeping' page**require ("beep.php")**contents of beep.php**<?phpsystem ("/home/site/exe/beep.executable");// on windows system ("c:\beep.exe");?> 
kexianin at diyism dot com
6 years ago
 If you can't see any output or error from system(), shell_exec() etc, you could try this: <?php function my_exec($cmd,$input='')          {$proc=proc_open($cmd, array(0=>array('pipe', 'r'), 1=>array('pipe', 'w'), 2=>array('pipe', 'w')), $pipes); fwrite($pipes[0], $input);fclose($pipes[0]);           $stdout=stream_get_contents($pipes[1]);fclose($pipes[1]);$stderr=stream_get_contents($pipes[2]);fclose($pipes[2]);           $rtn=proc_close($proc);           return array('stdout'=>$stdout, 'stderr'=>$stderr,                        'return'=>$rtn ); } var_export(my_exec('echo -e$(</dev/stdin) | wc -l', 'h\\nel\\nlo')); ?> For example, "echo shell_exec('ls');" will get nothing output, "my_exec('ls');" will get "sh: ls: command not found", "my_exec('/bin/ls');" will maybe get "sh: /bin/ls: Permission denied", and the permission may be caused by selinux. 
eric_REMOVE at movementmovement_REMOVE dot com
12 years ago
 It's important to note that if you are running a series of system() commands in a loop, you need to include the second argument in order for them to run synchonously.ie)// this will execute process.php asynchronously; not waiting for completion before executing the next one.$array = array('apple', 'banana', 'pear');foreach($array as $i){system("php process.php \"fruit=$i\"");}// this will execute process.php 3 times, waiting for the prior command to complete before starting a new one$array = array('apple', 'banana', 'pear');foreach($array as $i){system("php process.php \"fruit=$i\"", $status);}  Vinicius Monteiro 3 years ago  I have a way to get the return of system, using ob_start() and ob_get_contents(). Ex.:ob_start();system("echo I'll catch the buffer");$return = ob_get_contents();ob_end_clean(); 
Dennis
8 years ago
 If you are writing CLI scripts in PHP and call external programs which produce some kind of progress bar you should really use passthru()  for the output of the external program to go to the terminal immediately.Such progress bar are usually done by outputing the string with "\r" at the end, and contain no "\n". system() and friends look for "\n" before flushing the buffer. As a result, you see nothing during the lengthy operation and suddenly you get the 100% reading, because all output was buffered and quickly replayed into the terminal when the final "\n" has been seen. 
-1
gvs
2 years ago
 system() will flush the last line retuned from your executed process directly to the output buffer. This you will see in a double echo if you call 'echo system(...)' .To prevent this use exec() insteadorchange output buffering around the call. 
grytolle at gmail dot com
7 years ago
 This is a work-around that makes the program run in it's own directory instead of the script's. example usage: <?php runAsynchronously("c:\games\jazz2\jazz2.exe","-connect 1.2.3.4"); ?> <?php function runAsynchronously($path,$arguments) {     $WshShell = new COM("WScript.Shell");$oShellLink = $WshShell->CreateShortcut("temp.lnk");$oShellLink->TargetPath = $path;$oShellLink->Arguments = $arguments;$oShellLink->WorkingDirectory = dirname($path);$oShellLink->WindowStyle = 1;     $oShellLink->Save();$oExec = $WshShell->Run("temp.lnk", 7, false); unset($WshShell,$oShellLink,$oExec);     unlink("temp.lnk"); } ?> 
grytolle at gmail dot com
7 years ago
 A more direct approach: <?php function runAsynchronously($path) {$WshShell = new COM("WScript.Shell");     $oExec =$WshShell->Run(addslashes($path), 7, false); unset($WshShell,$oExec); } ?>  dukeman at seagate dot com 8 years ago  For novices remember that the executable has to be in a directory the server is serving or only local host will be able to access it.  Daniel Morris (danielxmorris.com) 8 years ago  How to produce a system beep with PHP.<?php function beep ($int_beeps = 1) {            for ($i = 0;$i < $int_beeps;$i++): $string_beeps .= "\x07"; endfor; isset ($_SERVER['SERVER_PROTOCOL']) ? false : print $string_beeps; }?>This will not do anything when running through a browser, if running through a shell it will produce an audible beep$int_beeps times.  This should work on Windows, Unix, etc. 
timgolding_10 at hotmail dot com
9 years ago
 An example of using the system to call the file command on a linux server. This script detects whether a user posted file is a jpeg, gif or png<?PHP$accepted_types=array("JPEG" , "GIF", "PNG"); // The temporary filename of the file in which the uploaded file was stored on the server. if(!empty($_FILES["uploadedfile"]))  {    $uploaddir =$_SERVER['DOCUMENT_ROOT']."/images/";    $uploaddir.=basename($_FILES['uploadedfile']['name']);   //verfiy file using linux FILE command $last_line = system('file '.escapeshellarg($_FILES['uploadedfile']['tmp_name']), $retval); //get the file extension returned through magic database$splitvals=explode(' image data' ,  $last_line);$vals=explode(':', $splitvals[0]);$vals[1]=str_replace(' ','', $vals[1]); if (in_array($vals[1], $accepted_types)) { echo$vals[1].' was accepted <br />';        if(!file_exists($uploaddir)){ //Copy the file to some permanent location if(move_uploaded_file($_FILES["uploadedfile"]["tmp_name"], $uploaddir)) { echo$uploaddir." was uploaded! <br />";             }            else             {              echo "There was a problem when uploding the new file, please contact admin about this.";             }        }        else echo 'This file already exists in DB please rename file before uploading';}}else echo $_FILES['uploadedfile']['error'].'<br />';?>  eis 9 years ago  It should be noted, too, that "unable to fork" error in Windows also occurs if you try to send a command that's too long for cmd.exe to process.  peter at randomnity dot com 9 years ago  Just a note to dan at thecsl dot org0 and FALSE are _NOT_ the same.You can check for false like so:<?phpif($return_val === FALSE) {   // ....} else if ($return_val == 0) { // ...}// Continue...?>  jordan314 at mailinator dot com 9 years ago  z1a7n8g, your system logging to file function was really useful, but had two errors:$line=fgets($fPtr,filesize("yourfile.php");that line needs a second closing ')'and:while ($line)returns true until your script runs out of memory. Those two lines can be combined:while($line=fgets($fPtr,filesize("yourfile.php"))); 
dan at thecsl dot org
10 years ago
 You probably want to check your system calls for errors. The convention is to return 0  for "no error" which is the same as FALSE which can be confusing. You need to do something like:<?php  $cmd = "/usr/bin/pngtopnm$png_file > $pnm_file"; system($cmd,$return_value); ($return_value == 0) or die("returned an error: $cmd");?>  -1 daveloop 5 years ago  I was trying to get the server-side to beep in windows 7. I finally found something that would work without creating my own EXE.Create a batch file with at the CMD prompt type: echo @echo (Alt-7)>beep.batThen execute it in PHP with: exec ('start /MIN c:\your_path_here\beep.bat');NOTE: The only drawback I can find is that a cmd.exe does visually flash on the system (which is why I used the /MIN to ensure it only goes to the taskbar). Not really sure why I don't like that, but it was a side effect that I wasn't looking for.  matt-php at cdsportland dot com 10 years ago  If using Windows with IIS and you're having problems with the system() and related commands, I found the easiest way to solve it was to modify the Authentication Method for the file (or directory) that uses the call and change the anonymous access user from the default (IUSR_IMAGE) to a user with enough permissions to execute the commands in the system call. This way, there is no need to give execute permissions to IUSR_IMAGE on cmd.exe (which opens up a security risk system-wide) or copy cmd.exe into your php directory (per the suggestions of others). Hope this helps someone!  vdweij at hotmail dot com 11 years ago  It is possible to only capture the error stream (STERR). Here it goes...(some_command par1 par2 > /dev/null) 3>&1 1>&2 2>&3-First STDOUT is redirected to /dev/null.-By using parenthesis it is possible to gain control over STERR and STOUT again.-Then switch STERR with STOUT. The switch is using the standard variable switch method -- 3 variables (buckets) are required to swap 2 variables with each other. (you have 2 variables and you need to switch the contents - you must bring in a 3rd temporary variable to hold the contents of one value so you can properly swap them).This link gave me this information:http://www.cpqlinux.com/redirect.html  Shai Coleman 11 years ago  The easiest way to run a process in the background under Windows, is to use system() with the bgrun.exe utility, available from http://www.jukkis.net/bgrun/  roga at yoopee dot de 12 years ago  In combination with Zend Optimizer and Windows 2K/XP some programs may not run with system(), exec(), etc.I tried to use a small tool for ejecting the cd tray and it did just nothing. Disabling Zend Optimizer solved it.  beetung at yahoo dot com 12 years ago  Under Linuxexec() doesnt follow symbolic link when interpret by httpd...I have my /home/www/cgi-bin --> soft linked to a samba mounted directory under /mnt/Downloads/www.site.com/cgi-binexec("/home/www/cgi-bin/runProg$a $b");works ok when I execute the script using > php myscript.php but fails to show the output when run via the web browser.When I give it the exact full path without the symbolic linkexec("/mnt/Downloads/www.site.com/cgi-bin/runProg$a $b");everything works perfectly.  djem at shadrinsk dot net 12 years ago  BUGFIX for the mysystem() function, posted by n-jones.<?phpfunction syscall($command){    if ($proc = popen("($command)2>&1","r")){        while (!feof($proc))$result .= fgets($proc, 1000); pclose($proc);        return $result; } }?>Hello from Russia! :)djem.  diogaogv at icqmail dot com 12 years ago  a really useful use for import(); while running the server at ur own machine is taking a screenshot of you desktop and showing it to the guest !!!<?echo system("/usr/X11R6/bin/import -window root -display localhost:0 /mnt/d/Desenvolvimento/Desenvolvimento\ WWW/import/cache/imagem.jpg -quality 30" ." 2>&1");?><img src="cache/imagem.jpg">remember to set chmod 777 to your directory (called "cache" on my code). also do "xhost +" or you r gonna get a xlib error saying that it could not connect to x server at localhost...the code is still too simple. i've just done it. e.g. you can improve a real cache system avoying more than one screenshot in a minute while...that is it! hope u enjoy it ( rofl... =DDD ) ...diogo86  lc at _REMOVE__THIS_lc dot yi dot org 13 years ago  Re: cpmorris at hotmail dot com and WINNT.I just spent some time learning to use the php system function. I managed to get long file names to work for me. It seems you need to take the same approach that batch files, WSH, and most other programming languages do under WinNT/2K/XP. Putting double quotes around the Path+Filename seems to work. So, something like this should have worked for you:"c:\program files\apache group\apache2\bin\htpasswd"Note that if you have parameters, they go OUTSIDE of the last quote. Oh, and don't forget to escape the slashes and quotes! I don't know what htpasswd's params are, but let us pretend:$cmd="\"c:\\program files\\apache group\\apache2\\bin\\htpasswd\" username password";$str=system($cmd);Hope this helps someone!Leonardhttp:\\www.lc.yi.org 
cnoelker at softpearls dot de
13 years ago
 Hi,some tips for using a system()-call for batch files on a windows computer:* Write the path to the executable with double back-slashes, like so:   C:\\path\\to\\prog.exe* If you are refering to other pathes, e.g. as a parameter, one back-slash works fine.* Do not use SET for declaring parameters - this does not work! Example:   SET PATH="C:\path\to\lib"   echo path is %PATH%This works fine when started from the comand line, but when called from PHP, the variable is just empty. 
a dot paul at bernardlabs dot com
14 years ago
 Well system is a pretty interesting and useful function.This might have been already pointed out by predessors but anyways, for anyone looking to execute command line queries from php or scripts in general, this function does the trick.However while using the command, you have to always think in terms of the command you are using as the function and the parameters as the arguments.So say I want to do a 'ls -ls' on /home/sites/sitexyz/www/$usernameI could do a system("ls -la \"/home/sites/sitexyz/www/$username\" ");Its important to think of this as passing      /home/sites/sitexyz/www/$username as an argument to the function ls -la .Similarly, you could do a system("cp -r \"/home/sites/sitexyz/www/$username\"  \"/home/sites/sitexyz/www/$username2\" ");But you then need to use 'chmod -R 777 to the directory you want to copy it to, which can be done by a system("chmod -R 777 \"/home/sites/sitexyz/www/$username2\" ");Now you can execute all the terminal commans via the php, however do realise the security concerns of using the same, especially when the operation is going to preceeded by some user input, so, you need to make sure you filter the inputs, or better not allow user intervention. 
tk at taponet dot de
14 years ago
 Beware: if (! system($cmd)) { print "error"; } does not work! Use if (system($cmd) === false) { ...} instead! 
ryan at seattleone dot com
15 years ago
 I was trying to use the system command, and I couldnt get it to work, then it occured to me, send the stderr to a file to see what is really happening. system( $command . " &> /tmp/error " );  digitalturbulence at softhome dot net 16 years ago  If the command printf("%s",system($cmd)); doesn't work, check the httpd.error_log file in your /var/log directory. At my home, the system command can just load binary files in the directory /usr/lib/apache/bin Stephan. 
ccurtis at aet-usa dot com
17 years ago
 If no headers have been printed, calling the system() function will flush the headers to the client and insert a newline; no further headers or cookies will be transferred to the browser.  In version 3.0.7, you will not be warned that the Header() function failed, but will be warned if trying to set a cookie.  If you want to continue to send headers after the function call, use exec() instead. 
-2
willytk at gmail dot com
9 years ago
 If you're having problems with getting imagemagick/convert to work with ghostscript because the gs executable isn't in the apache PATH, do the following:To create a thumb of the first pdf page:<?php$command= 'export PATH=$PATH:/sw/bin; convert "files/example.pdf[0]" -thumbnail 150x150 "files/thumbs/example.png"';$lastline = system($command,$return);?>Thanks entropy.ch and phpaladin!Regards,Willy T. KochOslo, Norway  -1 cho at stunt growth dot com 10 years ago  Note to the persons who suggested using backticks for gathering a return value from scripts via system().Using Backticks is generally frowned upon for security sake. They can be exploited more easily.Instead, why not use the exec() function with a return parameter specified as an array type. This will allow you to take the full string returned from your script (for example rsync) and return each line in an array.like so:$result = array();exec( $cmd, &$result);foreach ( $result as$v ){// parse, or do cool stuff}Hope this alternative brings you merriment. 
-1
z1a7n8g at / at a<o<l dot c<o<m
14 years ago
 I am currently using a form driven administrationpage to start an ftp server remotely from a web page in FreeBSD 4.5 using PHP 4.1.2 & apache 1.3.23. (Sorry guys, no CVS!!)This code will emulate a CLI command from your browser (anywhere!!) and execute it if your PHP module/binary has the correct permissions...<code><pre>//your front end<form ..your form stuff here...><input type="text" name=command><your additional form stuff>///the gutz<? $arg=explode( " ",$command, 4 )     if ($arg[0] = "system") { system($arg[1] . " " . $arg[2] . " " .$arg[3]..etc);            }?></code></pre>This works, however it is simple and lacks any error output.try:<pre><code> <?system(command > /path/to/yourfile.php);     $fPtr=@fopen("yourfile.php",r);$line=fgets($fPtr,filesize("yourfile.php"); while ($line)  {        $formatted_line=ereg_replace("your favorite newline semantic","<BR>",$line);        print $formatted_line; } ?></pre></code>Keep in mind the SECURITY implications with the use of this and like scripts. You've been warned.  -2 Tom Kaminski 1 year ago  Seems like php doesn't recognize the -e command line switch for system command "echo":<?phpsystem('echo -e hello');?>returns "-e hello", but you'd expect "hello". Odd thing is that you don't need to specify -e as it by default enables the interpretation of backslash escapes:<?phpsystem('echo \'hello\nthere\' ');?>returns:hellotherebut running the same command from the bash shell:# echo 'hello\nthere'returns:hello\nthereMy guess is that php does some special checks to see if echo is being executed by the system and automatically adds the -e switch.  -1 norman_ss at hotmail dot com 9 years ago  thanks to tr4nc3,I'm trying to, from the explorer, run an access's macro and this example give me the solution:You can execute a .bat file with the especifications that give us tr4nc3.After, in this .bat file, you can execute msacces.exe and pass /x parameter with the name of the macro. like this:"c:\windows\system32\cmd.exe /c <path or the msaccess.exe>" <path of the .mdb file> /x <name of the macro>"At the end of the .bat file you have to put "exit" and the thread will end.Thanks to tr4nc3!  -1 Stuart Prescott 11 years ago  Note that for stderr redirection, you have to use double quotes (") not single quotes (') for the 2>&1 part at least.<?//e.g. the this will NOT do what you expect:exec('mysqldump -h localhost ...... 2>&1',$output);//but this will:exec("mysqldump -h localhost ...... 2>&1", $output);?>*sigh*(Sounds like a PHP bug to me..., or at least buggy docs!)  -1 chris at karakas-online dot de 13 years ago  If your PHP installation permits execution of commands through system() (e.g. you are not running in safe mode, or, if you are, safe_mode_exec_dir contains all the commands you need), you can trigger a backup of your MySQL database, just by pointing your browser to the following script:<?php // Enter your MySQL access data$host= 'dbhost';           $user= 'dbuser';$pass= 'dbpassword';  $db= 'db';$backupdir = 'backups';     // Compute day, month, year, hour and min.  $today = getdate();$day = $today[mday]; if ($day < 10) {      $day = "0$day";  }  $month =$today[mon];  if ($month < 10) {$month = "0$month"; }$year = $today[year];$hour = $today[hours];$min = $today[minutes];$sec = "00";  // Execute mysqldump command.  // It will produce a file named $db-$year$month$day-$hour$min.gz   // under $DOCUMENT_ROOT/$backupdir  system(sprintf(     'mysqldump --opt -h %s -u %s -p%s %s | gzip > %s/%s/%s-%s%s%s-%s%s.gz',                                                      $host,$user,    $pass,$db,    getenv('DOCUMENT_ROOT'),    $backupdir,$db,    $year,$month,    $day,$hour,    $min )); echo '+DONE'; ?> If you are not allowed cron access on the web server, you can set up your own cron job to periodically call the above script. If you don't have cron, or a similar functionality on your system, you can still modify the above script to inform the browser to reget the file every xxx hours. A poor man's cron, so to say ;-)Of course, the$backupdir should at least be protected with a .htaccess file.And of course, you are not going to backup a really large database this way, if your PHP has some timeout set (as is usually the case with web hosters). 
-2
 Windows XP (IIS) users: (Unable to fork Problem)If you receive something like:Warning:  passthru() [function.passthru]: Unable to fork [dir] in c:\Inetpub\wwwroot\ping.php on line X1. Copy CMD.EXE file from the Windows\System32\ folder to your PHP directory (c:\PHP\).This should fix the problem. 
 I've found a very useful technique for the system function. Say if you want to create a page of quotes and you have /usr/games/fortune available. Instead of spending time creating a database and populating it with thousands of quotes, you can just use:<?phpsystem('/usr/games/fortune');?>likewise if you want to list the files in your directory, say for example, Mp3's?<?phpsystem('ls /home/mp3 -l');?>basically<?phpsystem('any_command');?>