Серверные приложения. Язык PHP
Цель работы
Изучить основы языка PHP. Разработать простое серверное приложение на языке PHP.
Задание к работе
Написать скрипт, учитывающий количество кликов по ссылкам на скачивание файлов, записывающий эти данные в файл, а затем выполняющий редирект на скачиваемый файл. Формат записи может быть, например таким:
имя_файла;дата/время;ip-адрес клиента;
Методические указания
Серверные приложения
Препроцессная обработка на стороне сервера подразумевает вызов программы-интерпретатора, которая обрабатывает запрашиваемый файл скрипта, исполняет его команды. Результат работы интерпретатора передается веб-серверу, который, в свою очередь, возвращает их клиенту (рис. 1)
Рис. 1. Препроцессинг HTML на сервере
Основы PHP
PHP (рекурсивный акроним для "PHP: Hypertext Preprocessor") это широко распространённый язык сценариев, который создан специально для Веб и который можно внедрять в HTML.
PHP изначально был разработан с тем, чтобы код выполнялся на сервере. Это позволяет передавать клиенту результат работы скрипта, не показывая ему, каков был исходный код.
PHP предельно прост для новичка в программировании, но предлагает много продвинутых возможностей для программиста-профессионала. Возможности PHP весьма широки, но освоить основные из них несложно за пару часов (конечно же, имея понятие о программировании в целом). Листинг 1 иллюстрирует применение PHP для формирования веб-страницы с текстом «Hello, World!» (курсивом выделен исходный код PHP).
Листинг 1 Простая программа на PHP
<?php $site_title = "A first PHP program"; $hello = "Hello, World!"; ?> <html> <head> <title><?PHP echo $site_title; ?></title> </head> <body> <?PHP //Вывести текст с меткой времени echo "<p style='font-size: 2em;'>I say $hello at ". date("H.i.s")."</p>"; ?> </body></html>
На рис. 2 показано, как выглядит приведенный сценарий при выполнении в браузере.
Рис. 2. Результаты выполнения сценария в браузере
Примеры скриптов
<?php // получение информации о настройках веб-сервера и PHP phpinfo(); //основы синтаксиса и программные единицы //переменные и вывод $str = "Hello, world"; echo "<h1>$str</h1>"; // это правильная конструкция. PHP способен разбирать строки и выделять переменные в них // условный оператор $min = -100; $max = 100; $i = rand($min, $max); if ($i > 0) {echo "<p>Число положительное</p>";} else if ($i < 0) {echo "<p>Число отрицательное</p>";} else {echo "<p>Ноль</p>";} // цикл for echo "<h2>Таблица умножения</h2>"; echo "<table>"; for ($i=1; $i<=10; $i++) { echo "<tr>"; for ($j=1; $j<=10; $j++) { echo "<td style = 'background-color: silver;width:25px; height:25px; text-align:center; vertical-align: middle;'>".($i*$j)."</td>"; } echo "</tr>"; } echo "</table>"; // оператор выбора (скрипт должен быть вызван с параметром uname (e.g.: samples.php?uname=vasya)) echo "<h2>Использование оператора выбора </h2>"; $who = $_GET["uname"]; $reply = "<b>Liza say:</b> "; switch ($who) { case "kolya" : $reply.="fiii..."; break; case "petya" : $reply.="khm..."; break; case "vasya" : $reply.="ohhh..yyyyes!"; break; default : $reply.= " Who's next?"; } echo "<p><b>".$who." say:</b> What do U think about Me? <p>".$reply; // массивы $fruits = array("banana", "plum", "apple", "peach"); sort($fruits); // сортировка - см. документацию PHP "Функции массивов" $out = ""; foreach ($fruits as $f) $out .= "<li>$f</li>"; // конкатенация строк echo "<ul>$out</ul>"; echo "<p>В массиве fruits ".count($fruits)." элем.</p>"; $fruits[5] = "pinapple"; print_r($fruits); // обратите внимание - элемент с индексом 4 в этом примере будет не определен echo $fruits[4]; // ошибка! этот элемент не определен $fruits[4] = ""; echo $fruits[4]; // элемент определен, но содержит пустую строку // многомерные массивы $vertex[1][0][0] = 1; $vertex[0][1][0] = 1; $vertex[0][0][1] = 1; print_r($vertex); // ассоциативные массивы $coords[0]["X"] = 55; $coords[0]["Y"] = 32; $coords[1]["X"] = 27; $coords[1]["Y"] = 0.56; print_r($coords); $page["head"] = "<head><title>PHP - it's easy</title></head>"; $page["body"] = "<body><p>A simple sample using associative arrays</p></body>"; print_r($page); $p = $page["head"].$page["body"]; // файловые операции $f = "read.me"; // файл в текущей директории if (file_exists($f)) // проверка существования файла $text = file_get_contents($f); // чтение из файла file_put_contents($f, $p); // запись в файл, директория должна быть доступна для записи (access rights - 777) // еще о файлах $fd = fopen($f, "a"); // открытие для дозаписи (здесь "a" - append) $str = "some text"; fwrite($fd, $str); // запись в конец файла fclose($fd); // переменные окружения echo "<h1>Переменные окружения</h1>"; foreach ($_SERVER as $var=>$val) { echo "<p>$"."_SERVER['$var'] = $val</p>"; }; // перенаправление запроса $url = "index.html"; header("Location:$url"); // функция header заголовки http, поэтому должна вызываться раньше любого вывода // Обработка параметров echo "<p>Пусть на сервер передан запрос вида http://myserv.dom/test.php?id=2344&uname=vasya&nick=vasiliok&age=19 (использован метод GET) <p>Требуется вывести все переменные из строки запроса."; echo "<ol><li>Использование функции печати массива: <br>"; print_r($_GET); foreach ($_GET as $key => $val){ echo "<li>parameter: <b>".$key."</b> value: <b>".$val."</b>"; } echo "</ul>\n<li>Поэлементный вывод (выводим только значения)<ul>"; echo "<li>ID: <b>".$_GET["id"]."</b>"; echo "<li>Firstname: <b>".$_GET["uname"]."</b>"; echo "<li>Nickname: <b>".$_GET["nick"]."</b>"; echo "<li>Age: <b>".$_GET["age"]."</b>"; echo "</ul></ol>"; echo "<p>Проверка, что переданы нужные параметры:"; if (isset($_GET["id"])) { echo "<p><b>do something...</b>"; } else { echo "<p><b>nothing to do ...</b>"; }; echo "<h2>Проверка, что передан нужный параметр и требуемое значение</h2>"; if ((isset($_GET["id"]))&&($_GET["id"] == 2344)){ echo "<p><b>do something...</b>"; } else { echo "<p><b>nothing to do ...</b>"; } ?>
В качестве примечания: Как видно из примеров, PHP очень тесно интегрируется с гипертекстом. Такой стиль кодирования называют "спагетти", поскольку сложно отделить содержание документа от его оформления, что напоминает слипшиеся макароны. На самом же деле, для профессиональных разработчиков PHP предлагает возможности разделения кода и данных как с помощью объектной парадигмы программирования, так и с помощью шаблонов, но рассмотрение этих вопросов выходит за рамки лабораторного практикума.
Ресурсы по PHP
Объем лабораторной работы не позволяет подробно рассматривать возможности языка (это справедливо не только для PHP), поэтому для экономии места укажем некоторые электронные ресурсы по PHP, где можно получить подробную информацию об этом языке и найти множество примеров его использования.
CC-BY-SA Анатольев А.Г., 09.06.2022