Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

PHP для не-разработчиков

Оригинал: PHP for Non-Developers
Автор: Shawn Powers
Дата публикации: 30 июня 2015 г.
Перевод: А. Панин
Дата перевода: 31 июля 2015 г.

PHP для не-разработчиков

После многих лет, в течение которых я заявлял о том, что не являюсь разработчиком в каждой из написанных для LinuxJournal статей, я хотел бы признаться кое в чем. Я могу разработать эквивалент программы "Hello World", работая с практически любым из существующих языков программирования. В случае ассемблера это может быть так же просто, как операция "1+1", но недостаток навыков разработки сложных приложений будет очевиден. В общем, я могу сказать про себя следующее: "Я всегда хотел научиться программировать, но мне настолько не нравится сам процесс, что я никогда не продвигался дальше разработки приложения "Hello World"".

Но впоследствии я узнал о языке программирования PHP.

Я знаю, что язык PHP уже не очень популярен. Я знаю и о том, что по сравнению с языком программирования Python его возможности очень ограничены. Но я также знаю и о том, что в процессе работы с PHP мне удалось создать несколько полезных программ с нуля. Я подозреваю, что это связано с тем, что мне очень нравится процесс разработки сценариев командной оболочки Bash. В случае работы с командной оболочкой Bash я всегда начинаю разработку сценария с рассмотрения поставленной задачи и применяю возможности интерпретатора сценариев командной оболочки для ее решения. Я никогда не "учился" разрабатывать сценарии командной оболочки Bash, я просто разрабатывал их. Целью данной статьи является подготовка читателя к непосредственному написанию полезного кода PHP. Если вы действительно желаете создать сценарий, выводящий надпись "Hello World" в окне веб-браузера, просто создайте его любым способом. При этом я не буду давать пояснений о том, как это можно сделать.

Подготовка к работе

Сервер:

Один замечательный аспект использования языка программирования PHP состоит в том, что соответствующий интерпретатор установлен практически на каждом веб-сервере и готов к исполнению сценариев. Если вы захотите разрабатывать более сложные сценарии, выполняющие системные вызовы в процессе взаимодействия с ядром Linux, может потребоваться незначительная модификация файла конфигурации php.ini, но в большинстве случаев подготовка интерпретатора PHP не намного сложнее установки веб-сервера со стеком приложений LAMP.

Одна из особенностей моей среды разработки, которая упрощает разработку сценариев, заключается в предоставлении возможности записи данных в директорию с разрабатываемым кодом для моей учетной записи пользователя. В моем случае процесс разработки обычно предусматривает внесение небольших изменений в код и нажатие кнопки обновления страницы в веб-браузере для проверки корректности этих изменений. В случае необходимости использования команды sudo cp localfile serverfile каждый раз при внесении изменения в код, процесс разработки будет слишком утомительным. Следует беспокоиться о корректных правах доступа к файлам в том случае, когда вы выпускаете программный продукт и размещаете его код на сервере в сети Интернет, а не тогда, когда вы занимаетесь разработкой кода этого продукта.

Единственной рекомендуемой мной настройкой, выполняемой на уровне сервера, является добавление в директорию с кодом файла .htaccess, который содержит директиву для активации механизма вывода сообщений об ошибках. Я не всегда активирую механизм вывода сообщений об ошибках, но в том случае, если вы столкнетесь с выводом "пустой страницы php", будет полезно быстро активировать данный механизм для того, чтобы после обновления страницы получить подробное сообщение об ошибке, указывающее на строку кода, в которой вы забыли добавить точку с запятой. Обычно я создаю файл с именем "err" и быстро переименовываю его в ".htaccess" тогда, когда хочу видеть в окне веб-браузера сообщения об ошибках. Вам, скорее всего, придется модифицировать файл конфигурации вашего веб-сервера Apache, установив путь к директории с разрабатываемым кодом в качестве значения директивы "AllowOverride", но это того стоит. Содержимое моего файла .htaccess выглядит аналогичным образом:

php_flag  display_errors        on
php_value error_reporting       2039

Редактор:

Код PHP является обычным текстом. Для его редактирования вы можете использовать любой удобный вам редактор. При этом я настоятельно рекомендую использовать текстовый редактор, осуществляющий подсветку синтаксиса, ведь благодаря этой возможности в значительной степени упрощается процесс поиска опечаток в коде. Обычно я использую текстовый редактор vim при разработке сценариев командной оболочки Bash но в случае PHP я столкнулся с необходимостью более частой прокрутки кода, поэтому в данном случае текстовый редактор, похожий на gedit, оказался более удобным для меня. Если вы желаете работать в действительно удобном окружении, замечательным выбором будет такое приложение, как Sublime или SlickEdit, но в любом случае текстовый редактор gedit вполне подойдет для работы с кодом. Просто имейте в виду, что в том случае, если ваш текстовый редактор может осуществлять подсветку синтаксиса, он отлично подойдет для работы с кодом. (В том случае, если вам требуется редактировать файлы на удаленном сервере, я бы порекомендовал рассмотреть возможность использования SSHFS для локального монтирования директории с удаленного сервера и редактирования файлов с удаленной системы по аналогии с файлами с локальной системы. Для этого отлично подходит текстовый редактор gedit).

Цель

В рамках данного первого погружения в мир программирования, я предлагаю создать что-либо полезное, но при этом простое. Я также хотел бы начать работу с создания программного продукта, на основе которого в будущем можно было бы создать другой программный продукт. Исходя из этого, давайте создадим стартовую страницу для вашего веб-браузера. Помните сервис iGoogle? Да, мы начнем с создания гораздо более простого сценария, но ввиду того, что вы самостоятельно разрабатываете данный сценарий, вы имеете возможность последующего расширения его возможностей. (Между прочим, я считаю разработку кода замечательным способом скоротать бессонные ночи.)

Как работает PHP

Мне потребовалось некоторое время для того, чтобы разобраться с данной концепцией, поэтому попытаюсь объяснить ее максимально кратко. Наравне с тем, как фрагменты кода PHP могут быть добавлены в документ формата HTML код PHP может использоваться непосредственно для генерации документа формата HTML. Следующие два фрагмента кода предназначены для выполнения одной и той же задачи.

test.php:

<html>
<body>
<h1>The current day is: <?php echo date("l"); ?>!</h1>
</body>
</html>

test2.php:

<?php
echo "<html>";
echo "<body>";
echo "<h1>The current day is: " . date("l") . "!</h1>";
echo "</body>";
echo "</html>";
?>

Попробуйте скопировать данные фрагменты кода в два отдельных файла PHP и открыть соответствующие адреса в веб-браузере. Вы должны увидеть страницу, аналогичную изображенной на Рисунке 1. Причина, по которой я затронул данную тему, заключается в том, что разные люди используют код PHP разными способами. Просто помните о том, что в том случае, если код не помещен в контейнер <?php ?>, он будет рассматриваться как классическая разметка документа HTML. Любые директивы, расположенные внутри данного контейнера <?php ?>, исполняются, а их вывод отправляется в окно веб-браузера. Нередко код PHP не генерирует вывода, поэтому в окне браузера не выводится какой-либо информации. Но в том случае, если вы хотите использовать код PHP, он должен быть помещен внутри упомянутых тэгов, а именно: <?php ЗДЕСЬ ДОЛЖЕН БЫТЬ КОД PHP ?>.

Это не приложение

Рисунок 1. Это не приложение "Hello World", но я не могу не признать того, что оно находится в опасной близости от него

Давайте создадим что-нибудь стоящее!

Я создал сценарий PHP для генерации простой веб-страницы. (На Рисунке 2 показан вывод этого сценария.) Вы можете загрузить архив с данным сценарием по следующей ссылке: http://snar.co/ljphp. Исходный код сценария также приведен в Листинге 1. Распакуйте загруженный zip-архив и разместите файл сценария в директории для сценариев вашего веб-сервера для того, чтобы впоследствии отредактировать его в соответствии со своими пожеланиями.

Это веб-портал. Наверняка ваша семья выглядит менее глупо!

Рисунок 2. Это веб-портал. Наверняка ваша семья выглядит менее глупо!

Листинг 1. Пример сценария для генерации простой веб-страницы

<?php

// Это комментарий. В следующих строках загружается информация о погоде,
// которая впоследствии помещается в массив PHP (для получения данной 
// информации вам потребуется собственный ключ API!)

$json=file_get_contents("http://api.wunderground.com/
 api/ЗДЕСЬ_ДОЛЖЕН_БЫТЬ_ВАШ_КЛЮЧ_API/conditions/pws:1/q/49749.json");
$weather = json_decode($json, TRUE);
?>

<html>
<head><h3>Landing Page</h3></head>
<body>
<table style="text-align: left; width: 100%;" border="0" 
  cellpadding="2" cellspacing="2">
    <tr>
        <td>
            <img style="width: 250px;" alt="The Fam!"
               src="fam.jpg"><br>
            <?php
                echo "Current Temp: " .
                  $weather['current_observation']['temp_f'] 
                   . "F<br>";
                echo "Conditions: " .
                  $weather['current_observation']['weather'] 
                   . "<br>";
                echo "<small>" . $weather['current_observation']
                 ['observation_time'] . "</small><br>";
            ?>
        </td>
    <td style="vertical-align: top;">
                Shawn's Very Simple Page<br>
        <big><strong><a href="http://www.brainofshawn.com">Are You
          Looking for My Blog?</a></strong></big>
                <br><br>
                <?php
                        echo "Google is: ";
                        is_up("www.google.com");
                        echo "<br>";
                        echo "Linux Journal is: ";
                        is_up("www.linuxjournal.com");
                        echo "<br>";
                        echo "Blarxnot is: ";
                        is_up("wwww.blarxn0t.com");
                ?>
        </td>
    </tr>
    <tr>
        <td colspan="2">
        <?php echo "<br><center>Server Uptime: " .
          shell_exec("/usr/bin/uptime") . "</center>"; ?>
        </td>
    </tr>
</table>
</body>
</html>

<?php
    function is_up($host,$port=80,$timeout=1)
    {
    $fsock = fsockopen($host, $port, $errno, $errstr, $timeout);
    if ( ! $fsock )
            {
            echo "DOWN";
    }
    else
    {
        echo "UP";
    }
    }
?>

Обратите внимание на то, что в первой строке размещен тэг <?php указывающий на то, что далее размещается блок кода PHP, а не разметка документа HTML. Первой операцией, выполняемой в рамках данного сценария, является загрузка информации о погоде, получаемой с помощью соответствующего API, в массив PHP. Вам придется самостоятельно зарегистрироваться на ресурсе Wunderground для получения ключа API (эти ключи раздаются безвозмездно), после чего модифицировать строку URL таким образом, чтобы она содержала указание на ваше место проживания. С целью упрощения можно разделить данный процесс на два этапа: сначала вы загружаете строку в формате JSON и сохраняете ее в рамках переменной с именем $json, после чего используете функцию json_decode для разбора данной строки и помещения полученных значений в массив. Обратитесь к разделу "Работа с массивами" для ознакомления с некоторыми советами относительно исследования массивов благодаря которым вы в любом случае сможете сделать вывод о содержимом того или иного массива.

После последней строки небольшого фрагмента кода, выводящего изменяющиеся данные, секция кода PHP закрывается с помощью тэга ?> в строке 8. После данного тэга следует разметка документа HTML, которая должна быть достаточно понятной. Для упрощения разметки документа я создал простую таблицу. В первой ячейке этой таблицы размещена фотография моей семьи (вы можете добавить файл фотографии своей семьи с именем fam.jpg в директорию, в которой размещен рассматриваемый файл сценария PHP), после чего я открываю следующую секцию кода PHP. В рамках данной секции кода я осуществляю вывод некоторой информации о погоде, полученной посредством соответствующего API. Вы можете без сложностей разобраться с большей частью данного кода за исключением точек, используемых в рамках вызовов функции echo(), заслуживающих отдельного обсуждения. В том случае, если вы хотите вывести на экран более одной строки с помощью одного вызова соответствующей функции, вы должны разместить символы точек между этими строками вне символов кавычек.

После еще одного блока разметки HTML размещен блок кода, который осуществляет проверку текущей работоспособности веб-серверов. Важно понимать то, что функция "is_up" является не встроенной функцией языка программирования PHP, а разработанной лично мной с целью повышения читаемости кода функцией. Если вы осуществите прокрутку кода до конца, вы увидите объявление функции, а также ее реализацию. Единственной проверкой, осуществляемой в рамках данной функции, является проверка возможности соединения с портом 80 узла с заданным адресом. Я специально добавил проверку сервера с несуществующим адресом blarxn0t.com, которая должна завершаться неудачей. Надеюсь, что никто не приобретет домен blarxn0t.com только для того, чтобы показать мою некомпетентность. (Примечание: не пытайтесь посетить данный сайт, ведь для того, чтобы порадовать такого "удачливого" человека, как я, кто-то наверняка уже приобрел данный домен и создал на его основе ресурс для взрослых!)

В последней части сценария PHP используется действительно крутой прием программирования на PHP, позволяющий выполнить локальную команду с помощью установленной командной оболочки и разместить вывод данной команды в окне веб-браузера. Таким образом вывод команды uptime размещается в конце рассматриваемой простой веб-страницы. В том случае, если вы используете веб-сервер в процессе работы с ОС Windows, с большой вероятностью будет выведено сообщение об ошибке, но все же я предполагаю, что все читатели данной статьи работают с Linux.

Бесконечность - не предел!

Данная первая страница, сгенерированная с помощью сценария PHP, является на самом деле очень простой. Несмотря на то, что я затронул некоторые сложные аспекты разработки сценариев, я надеюсь, что вы приступите к самостоятельному изучению рассматриваемого языка программирования после чтения данной статьи. Массивы действительно полезны и в значительной степени упрощают работу с API различных веб-сайтов. Если вам понравился данный краткий экскурс в мир программирования на PHP, я могу порекомендовать рассмотреть самостоятельно следующие темы:

  • Условные переходы if/then/else

  • Циклы for

  • Циклы while

  • Чтение и запись файлов системы

  • Передача переменных и их значений с помощью методов GET и POST

  • Функции

  • Подключение дополнительных файлов PHP

При этом я хотел бы предупредить вас о том, что не следует разбирать данные темы и просто запоминать приемы работы с теми или иными механизмами. Сформулируйте реальную задачу и решайте ее! Я получал информацию обо всех необходимых мне механизмах языка программирования PHP из выдач поисковой системы Google, сгенерированных после ввода таких запросов, как "Как вывести большие числовые значения с использованием запятых в PHP" или "Как округлять числа в PHP" или даже "Как обрабатывать запросы в PHP в отдельных программных потоках для параллельной обработки данных?" (С помощью последнего запроса я искал информацию о наиболее сложном приеме разработки из тех, что я использовал до текущего времени!)

Процесс разработки сценариев на языке программирования PHP доставляет удовольствие. Я не верю, что говорю об этом, но это чистая правда. Если вам нравится разрабатывать сценарии командной оболочки Bash и вы не можете жить без этого, я подозреваю, что вам также понравится разрабатывать сценарии PHP, так как процессы разработки сценариев очень похожи, но в случае PHP вам придется использовать веб-браузер в качестве механизма ввода-вывода! Если вы желаете, чтобы я писал больше статей, посвященных изучению языков программирования в ходе реализации реальных проектов, пожалуйста, дайте мне знать. Я хотел бы опубликовать информацию о работе над другими простыми интересными проектами, но это имеет смысл лишь в том случае, если продолжение серии интересно читателям!

Работа с массивами

Массивы могут могут смутить начинающего разработчика. В данной статье я показал пример преобразования загруженной посредством соответствующего API строки в формате JSON в массив PHP с последующим доступом к некоторым значениям из этого массива. Но как узнать имена переменных, которые следует использовать для доступа к строкам из массива, такие, как $weather['current_observation']['temp_f']? К счастью, существует отличный инструмент для вывода содержимого массивов на экран. Ниже приведен фрагмент кода, содержащий код для преобразования строки формата JSON из основного примера статьи и выводящий полное описание массива, благодаря которому вы можете без лишних сложностей выяснить имена всех индексов массива. Благодаря ему вы можете разобраться с тем, как осуществлялся доступ к строкам из массива в примере выше:

array_view.php

<?php
$json = file_get_contents("http://snar.co/jsonapi");
$weather = json_decode($json, TRUE);
echo "<pre>";
print_r($weather);
echo "</pre>";
?>

После того, как вы загрузите соответствующую страницу, данный сценарий выведет полное описание массива в легко читаемом формате в окне вашего веб-браузера. Тэги <pre> важны; если вы отбросите их, вывод будет размещен в одной строке. Всегда, когда я пытаюсь ознакомиться с содержимым массива, я быстро создаю и использую аналогичный файл сценария PHP. Надеюсь, вы сможете выяснить необходимые имена индексов массива и приведенный код окажется полезным.