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.