Web service: software functionality that can be invoked through the internet using common protocols
A remote function(s) you can call by contacting a program on a web server
Many web services accept parameters and produce results
Can be written in PHP and contacted by the browser in HTML and/or AJAX code
The service's output might be HTML but could be text, XML, JSON, or other content
header
          header("Content-type: type/subtype");
            
          PHP (template)
          header("Content-type: type/plain");
          print "This output will appear as plain text now!\n";
            
          PHP (example)
By default, a PHP file's output is assumed to be HTML (text/html)
However, in this course we aren't using PHP to generate HTML, so we use the header
						 function to specify non-HTML output
header
							| MIME type | file extension | 
|---|---|
| text/html | .html | 
| text/plain | .txt | 
| image/gif | .gif | 
| image/jpeg | .jpg | 
| video/quicktime | .mov | 
| application/octet-stream | .exe | 
List of MIME types
Write a web service that accepts a base and exponent and
          outputs base to the exponent power. For example, the following
          query should output 8:
          http://example.com/exponent.php?base=2&exponent=3
            
          Solution
<?php
  header("Content-type: text/plain"); // return as plain text
  $base = (int) $_GET["base"];
  $exp = (int) $_GET["exponent"];
  $result = pow($base, $exp);
  print $result;
?>
            
          PHP
Try creating an exponent.php file with this in it. Call this php file from your server with the appropriate parameters and see what the result is.
<?php
if ((isset($_GET["base"]) && !is_numeric($_GET["base"])) ||
  (isset($_GET["exponent"]) && !is_numeric($_GET["exponent"]))) {
    header("HTTP/1.1 400 Invalid Request");
    header("Content-type: text/plain");
    print("Parameters must be numerical values")
  }
  else {
    ...
  }
?>
					
					PHP
We are focused on PHP for data generation!
We are showing you this strictly for historical purposes
The next slides are for informational purposes only
          HTML content
          <?php
             PHP code
          ?>
          HTML content
          <?php
             PHP code
          ?>
          HTML content...
          
          HTML/PHP (template)
Any contents of a .php file between <?php and
          ?> are executed as PHP code
All other contents are output as pure HTML
<DOCTYPE html>
<html>
  <head><title>CSE 154: Embedded PHP</title></head>
  <body>
  <?php for ($i = 99; $i >= 1; $i--) { ?>
    <p> <?= $i ?> bottles of beer on the wall, <br />
  <?= $i ?> bottles of beer. <br />
    Take one down, pass it around, <br />
  <?= $i - 1 ?> bottles of beer on the wall. </p>
  <?php } ?>
  </body>
</html>
          
          PHP
This is messy! There are much better ways to do this, and you should not write any embedded PHP in this class. But you should be aware of it.
| function name(s) | category | 
|---|---|
| file, file_get_contents, file_put_contents | reading/writing entire files | 
| basename, file_exists, filesize, fileperms, filemtime, is_dir, is_readable, is_writable, disk_free_space | asking for information | 
| copy, rename, unlink, chmod, chgrp, chown, mkdir, rmdir | manipulating files and directories | 
| glob, scandir | reading directories | 
| function | description | 
|---|---|
| glob | returns an array of all file names that match a given pattern (returns a file path and name, such as "foo/bar/myfile.txt") | 
| scandir | returns an array of all file names in a given directory (returns just the file names, such as "myfile.txt") | 
Can accept a general path with the * wildcard (more powerful).
glob Example
          $ducks = glob("ducks/*");
          
          PHP
Array
(
  [0] => ducks/B-duck
  [1] => ducks/D-duck
	...
  [11] => ducks/X-duck
  [12] => ducks/Z-duck
)
          
          result
glob can match a wildcard path with the * character
glob("foo/bar/*.doc") returns all .doc files in the foo/bar
              subdirectoryglob("food*") returns all files whose names begin with "food"The basename function strips any leading directory from a file path
basename("ducks/B-duck") returns "B-duck"scandir Example
          $ducks = glob("ducks/*");
          
          PHP
Array
(
  [0] => .
  [1] => ..
  [2] => B-duck
  [3] => D-duck
	...
  [13] => X-duck
  [14] => Z-duck
)
          
					result
scandir includes current directory (".") and parent ("..") in the array.
Don't need basename with scandir; returns file names only
          without directory
| contents of foo.txt | file("foo.txt") | file_get_contents("foo.txt") | 
|---|---|---|
                Hello
how r u?
I'm fine
                
               | 
              
                array("Hello\n", #0
"how r u?\n",    #1
"\n",            #2
"I'm fine\n"     #3
)
                
               | 
              
                "Hello\n
how r u\n    # a single
\n           # string
I'm fine\n"
                
               | 
            
            The file function returns lines of a file as an array (\n at end of each).
          
file_get_contents returns entire contents of a file as a single string.
file_put_contents writes a string into a file.
file Function
          # display lines of file as a bulleted list
          $lines = file("todolist.txt");
          foreach ($lines as $line) { # for ($i = 0; $i < count($lines); $i++)
            print $line;
          }
          
          PHP
file returns the lines of a file as an array of strings.
Each ends with \n; to strip it, use an optional second parameter:
          $lines = file("todolist.txt", FILE_IGNORE_NEW_LINES);
          
          PHP
Common idiom: foreach or for loop over lines of file
          # reverse a file
          $text = file_get_contents("poem.txt");
          $text = strrev($text);
          file_put_contents("poem.txt", $text);
          
          PHP
file_get_contents returns entire contents of a file as a string
file_put_contents writes a string into a file, replacing its old
            contents
          # reverse all poems in the poetry directory
          $poems = glob("poetry/poem*.dat");
          foreach ($poems as $poemfile) {
            $text = file_get_contents($poemfile);
            file_put_contents($poemfile, strrev($text));
            print "I just reversed " . basename($poemfile) . "\n";
          }
          
          PHP
          # add a new line to a file
          $new_text = "P.S. ILY, GTG TTYL!~";
          file_put_contents("poem.txt", $new_text, FILE_APPEND);
          
          PHP
| old contents | new contents | 
|---|---|
| 
                Roses are red
                 Violets are blue All my base Are belong to you.  | 
              
                Roses are red
                 Violets are blue All my base Are belong to you. P.S. ILY, GTG TTYL!~  | 
            
file_put_contents can be called with an optional third parameter to append
          (add to
          end) rather than overwrite.