Применение php: методы на стороне сервера, которые помогут вам в разработке интерфейсов

Микросервисы

Будем рассматривать все на примере вышеупомянутого блога. Безусловно, это задача ради задачи, но хочется отметить что даже в таком варианте, это работать будет и будет работать неплохо (быстро и без проблем).


Суть микросервисов легко понять в сравнении с монолитной архитектурой. Как у нас выглядит обычный движок для блога? Грубо говоря это просто одно приложение. Работа с статьями, комментариями, страницами, пользователями и прочими функциональными единицами заключена в едином пакете исходного кода, который не делится никак.

Где все связи между компонентами — это вызовы внутри кода, какие-то отношения между классами, паттерны и т.п. или даже просто говнокод, если нельзя отделить одно от другого.

Как будет выглядеть наш блог? Да примерно также, если честно.

Единственное отличие, что квадратики с компонентами — это больше не компоненты заключенные в код одного приложения, а стрелочки — это больше не системные вызовы классов внутри этого кода. Теперь — это отдельные компоненты, а стрелочки — обычные запросы по http.

Зачем это нужно? Сразу определимся, что наверное, это нужно не всем. Это должно быть очень удобно, если вы — достаточно крупная компания, способная выделить по команде разработки на каждый сервис. Думаю, даже средним компаниям, если выделить по человеку на каждый сервис будет тоже неплохо. Впрочем, даже если ты один на всю компанию, ты сможешь найти в микросервисах что-то интересное.

Насколько большим должен быть сервис? Границы провести сложно, ошибка будет стоить вам дорого, но, если вкратце, то сервис это некая единица вашей системы, которую вы можете полностью переписать за короткое время. Эмпирически пусть за неделю вы или ваша команда должны справится с сервисом. Основная идея тут — сервисы должны быть небольшие. Они не должны превращаться в кучу монолитов.

Итак, позитивные вещи, которые я смог выделить для себя, в целом все они проходят под одним трендом: Невероятное удобство для разработки:

  • Отказоустойчивость. Так как связи между сервисами больше не жесткие, сервис может умереть по чьей-то глупости (например сервис комментариев), но в целом на блоге это не скажется никак, кроме того что пропадут комментарии.
  • Язык. Вы можете разработывать новый сервис на чем угодно. В общем выбор языка перестает напоминать поиск серебряной пули, для каждого компонента системы вы можете выбрать тот инструмент, который ей подходит больше всего в текущий момент времени. Почему? Потому что это больше не дорого для компании (сервис маленький), вы всегда можете выкатить старый сервис назад, вы даже можете использовать одновременно одинаковые сервисы написанные на разных языках, чтобы понять, что лучше. Цена ошибки неизмеримо меньше.
  • Маштабируемость. Приложение тормозит и не справляется? Нужен новый огромный сервер для всего приложения, а лучше 10? Забудьте. Теперь вы можете масштабировать сервисы. Просто добавьте побольше сервисов 🙂
  • В целом высокая скорость работы, как результат всего что выше.

Что должно уметь наше приложение? Так то не очень много. Четыре страницы:

  • Список постов
  • Открытый пост с комментариями
  • Добавление поста
  • Авторизация

Функционал простой:

  • Авторизованный пользователь может добавить пост
  • Кто угодно может его комментировать.

Формы

Если вы знакомы с html, то знаете, что с его помощью нельзя просто так получить информацию, введенную пользователем. То есть вы можете создать красивую форму, но без PHP или другого подобного языка все данные просто исчезнут, когда он нажмет кнопку «Отправить».

Для начала создается форма подобного вида:

<form action=”/auth.php” method=”post”> <!—Форма—>

<input type=”text” name=”login” placeholder=”Логин”><br> <!—Поле ввода логина—>

<input type=”password” name=”password” placeholder=”Пароль”><br> <!—Поле ввода пароля—>

<input type=”submit” value=”Войти”> <!—Кнопка отправки данных—>

</form>

У тега <form> есть два атрибута: action и method. В первом указывается страница, куда будут отправлены данные, а во втором — метод передачи. Всего их два:

  1. POST — безопасный, но медленный метод. Им пользуются для передачи конфиденциальной информации: пароли, логины, адреса и так далее.
  2. GET — простой, но уязвимый метод. Вы могли видеть ссылки вида index.php?page=8&category=2. Информация записывается прямо в ссылку, и любой может поменять ее значение или поделиться ею, поэтому лучше не передавать так ничего секретного и позаботиться о дополнительной безопасности.

Из формы на страницу auth.php будут переданы переменные login и password. В зависимости от метода они попадут в супермассив $_POST или $_GET. Дальше на этой странице можно будет сделать с ними все что угодно, в том числе и проверить их наличие в базе данных.

Проектируем базу данных

Прежде чем приступить к разработке блога, нужно спроектировать базу данных, но еще раньше нужно определиться, что у нас вообще должно получиться. Давайте для начала создадим не большой, в плане функционала, блог, который будет иметь категории статей, статьи и будет возможность писать комментарии к статьям. Возможно, потом расширим возможности, но пока для того, чтобы лучше понять MVC нам и этого хватит. Итак, приступим к созданию бд, нам потребуется три таблицы – для категорий, для статей и для комментариев. На картинке можете посмотреть структуру таблиц: А также создать бд можете, воспользовавшись sql-патчем:

CREATE TABLE `category` (
  `id` INT(10) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(50),
  `is_active` TINYINT(1),
  PRIMARY KEY  (`id`)
);

CREATE TABLE `article` (
  `id` INT(10) NOT NULL AUTO_INCREMENT,
  `id_category` INT(10),
  `title` VARCHAR(255),
  `small_text` TEXT,
  `text` TEXT,
  `date_create` DATE,
  `is_active` TINYINT(1),
  PRIMARY KEY  (`id`)
);

CREATE TABLE `comments` (
  `id` INT(10) NOT NULL AUTO_INCREMENT,
  `user_name` VARCHAR(50),
  `text` TEXT,
  `date_create` DATETIME,
  `is_active` TINYINT(1),
  PRIMARY KEY  (`id`)
);


ALTER TABLE `article` ADD CONSTRAINT `article_fk1` FOREIGN KEY (`id_category`) REFERENCES category(`id`);

Конструктор

Затем мы создаем методы класса. Это функции, которые привязаны к классу и к объекту, создаваемому из класса. Наш основной код вызывает методы для манипулирования данными в объекте .

Первый метод, , является конструктором. Это специальный метод, который автоматически вызывается системой PHP каждый раз, когда создается новый объект . Наш конструктор получает необязательный массив , в котором содержатся данные для свойств нового объекта. Затем мы присваиваем данные свойствам в теле конструктора. Таким образом, получается удобный способ для создания и инициализации объекта в одно действие.

означает: «Свойство объекта с именем «».

Обратите внимание, что метод фильтрует данные, прежде чем присвоить их свойствам. Свойства и приводятся к типу с помощью , так данные значения должны быть типа

Свойства и фильтруются с помощью регулярных выражений, так как в них допускает наличие символов из определенного набора. С точки зрения безопасности фильтрация данных ввода — отличная практика. Пропускаем только допустимые значения и символы.

Однако, мы не фильтруем свойство . Почему? Вероятно, администратор захочет использовать более широкий диапазон символов в содержании статьи — например, разметку HTML. Если мы ограничим диапазон доступных символов в содержании, то снизим полезность нашей системы для администратора.

Безопасность кода PHP выходит за рамки наших уроков. Вам следует посвятить определенное время для изучения данного вопроса.

Мёртвый код: найти и обезвредить

Меня зовут Данил Мухаметзянов, я работаю бэкенд-разработчиком в Badoo уже семь лет. За это время я успел создать и изменить большое количество кода. Настолько большое, что в один прекрасный день ко мне подошёл руководитель и сказал: «Квота закончилась. Чтобы что-то добавить, нужно что-то удалить». Ладно, это всего лишь шутка — он такого не говорил. А жаль! В Badoo за всё время существования компании накопилось больше 5,5 млн строк логического бизнес-кода без учёта пустых строк и закрывающих скобок. Само количество не так страшно: он лежит, есть не просит. Но два-три года назад я начал замечать, что всё чаще читаю и пытаюсь разобраться в коде, который на самом деле не работает в продакшен-окружении. То есть, по сути, мёртв. Эту тенденцию заметил не только я. В Badoo поняли: наши высокооплачиваемые инженеры постоянно тратят время на мёртвый код.

Научитесь DRY


Рассмотрим код…

PHP

$mysql = mysql_connect(‘localhost’, ‘reinhold’, ‘secret_hash’); mysql_select_db(‘wordpress’) or die(&quot;cannot select DB&quot;);

1 2

$mysql=mysql_connect(‘localhost’,’reinhold’,’secret_hash’);

mysql_select_db(‘wordpress’)ordie(&quot;cannot select DB&quot;);

теперь применением к нему подход DRY:

PHP

$db_host = ‘localhost’; $db_user = ‘reinhold’; $db_password = ‘secret_hash’; $db_database = ‘wordpress’;

$mysql = mysql_connect($db_host, $db_user, $db_password); mysql_select_db($db_database);

1 2 3 4 5 6 7

$db_host=’localhost’;

$db_user=’reinhold’;

$db_password=’secret_hash’;

$db_database=’wordpress’;

$mysql=mysql_connect($db_host,$db_user,$db_password);

mysql_select_db($db_database);

Изображения

Используется, например, для реализации капчи, когда нужно, чтобы каждый раз выводилось уникальное число. Для этого создается файл captcha.php, а потом он указывается как ссылка на изображение.

<img src=”/captcha.php” title=”Введите код с картинки”>

В самом этом файле генерируется случайное число, а потом выводится на изображение. Или можно обрезать картинку, загруженную пользователем. Например, если необходимо подогнать все аватарки под один размер.

<?

$image = imagecreatetruecolor(100, 100); //Создаем полотно с разрешением100 ×100 пикселей

$avatar = imagecreatefromjpeg(‘avatar_01.jpg’); //Загружаем изображение из файла

//Отрисовываем загруженный файл на полотне 

imagecopyresampled($image, $avatar, 0, 0, 0, 0, 100, 100, 100, 100);

//Сохраняем

imagejpeg($image_p, ‘avatar_02.jpg’, 100);

?>

Если вы собираетесь использовать этот код, добавьте масштабирование и поработайте над соотношением сторон.

Разработка сервисов

Если мы говорим о разработке, а не о наполнении контентом, стоит вспомнить и другие возможности PHP.

У PHP есть модули для лёгкой работы с базами данных, электронной почтой, службами каталогов и многими другими технологиями. Благодаря этому возможно создавать сервисы без привязки к вебу — например, для работы с данными внутри организации. Сервис, позволяющий получить информацию о сотрудниках из корпоративной базы данных — пустяковая задача для PHP.

Другая сильная сторона PHP — автоматизация действий. PHP работает на стороне сервера, и на нём можно разрабатывать различные сценарии для автоматизации: делать резервные копии информации, собирать и доставлять проекты на рабочий сервер, создавать и редактировать пользователей и т.д. Эти сценарии работают прямо из командной строки, без необходимости создавать графический интерфейс.

Парсинг

Парсинг — это сбор информации с других сайтов. Например, вы часто могли видеть поиск по сайту, который реализован с помощью или «Яндекса».

<?

$query = $_POST; //Получаем запрос пользователя

$searchQuery = “https://yandex.ru/search/?text=site:skillbox.ru+”.$query; //Преобразуем запрос в ссылку

$results = file_get_html($searhQuery); //Получаем страницу

$links = $results->find(‘a’); //Находим все ссылки на странице

?>

Так это реализуется с помощью библиотеки PHP Simple HTML DOM Parser. Но, как вы могли заметить, мы получили все ссылки на странице — то есть не только ведущие на найденные сайты, но и ведущие на другие проекты «Яндекса».

Определение вашей первой функции Function()

Создание функций в PHP почти идентично их реализации в Javascript. Основной синтаксис таков…

PHP

<?php function name ($arguments){ your statement goes here; } ?>

1 2 3 4 5

<?php

functionname($arguments){

your statement goes here;

} ?>


Если бы мы хотели создать функцию, которая отображает («echo») 10 плюс 5, мы могли бы написать…

PHP

<?php function addNumbers (){ echo 10 + 5; } addNumbers(); ?>

1 2 3 4 5 6

<?php

functionaddNumbers(){

echo10+5;

}

addNumbers();

?>

Мы создаем простую функцию, которая даст выходные данные «15″. Мы вызываем функцию с помощью «addNumbers(). В этом случае мы не используем никаких параметров. Давайте посмотрим, как можно реализовать их, чтобы сделать нашу функцию более общей.

PHP

<?php function addNumbers($firstNumber, $secondNumber){ echo $firstNumber + $secondNumber; } addNumbers(10, 5); ?>

1 2 3 4 5 6

<?php

functionaddNumbers($firstNumber,$secondNumber){

echo$firstNumber+$secondNumber;

}

addNumbers(10,5);

?>

Теперь наш код уже гораздо гибче. Создав функцию «addNumbers()», мы добавили два параметра — $firstNumber и $secondNumber. Функция будет просто отображать сумму этих двух переменных. При вызове функции нам придется передавать два числа — addNumbers(10, 5). В общей ситуации значения этих переменных могли бы быть взяты из пары текстовых полей.

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

Перевод и редакция: Рог Виктор и Андрей Бернацкий. Команда webformyself.

P.S. Хотите опубликовать интересный тематический материал и заработать? Если ответ «Да», то жмите сюда.


Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

Получить курс сейчас!

Илья, 22 года

На PHP программирую года четыре, осмысленно — года два. В компаниях ещё не работал, делал заказы на фрилансе, разрабатывал админки, системы управления для компаний, интегрировал с разными сервисами.

  • Почему ты выбрал именно этот язык?

    Язык выбирают уже осознанные дяди, которые успели попрограммировать на всём. А я, как и многие другие, пишу на PHP, потому что как-то попробовал и зашло. У PHP очень низкий порог входа, на нём быстро что-то написать, легко проверять, что получается, не надо компилить каждый раз.

    В веб-разработку попасть проще, чем в разработку приложений для ПК или телефонов. Во времена моего фриланса на PHP было намного больше заказов, чем на других серверных языках программирования. Да и новичку проще взять хостинг, где PHP работает из коробки, и ничего не надо настраивать. Просто пишешь код, и оно работает. Так не получится с Python, например.

  • Три вещи, которые ты больше всего любишь в PHP?

    1. PHP не привязывает тебя ни к какой парадигме программирования: пиши, как кажется правильным, и оно заработает, а когда наберёшься опыта — тогда и построишь грамотную архитектуру.
    2. Большое количество информации, обучающих курсов, литературы и скринкастов.
    3. Самый популярный язык серверной разработки, и как следствие — ответы почти на все вопросы есть в интернете.
  • Что больше всего не любишь в PHP?

    Из-за того, что в нём легкий вход, часто приходится иметь дело с плохой, не расширяемой архитектурой, с которой очень сложно взаимодействовать, когда её писал не ты.

  • На чём бы ты писал, если бы PHP не существовало?

    Python, я на нём писал до PHP. Или хотелось бы попробовать Go, звучит модно.

  • Совет тому, кто выбирает язык

    Бери PHP, поработай с ним пару лет, а потом уже появится понимание, что тебе необходимо от языка программирования, и будут критерии для сравнения.

Получить реальный IP пользователя

function get_ip() {
    //Just get the headers if we can or else use the SERVER global
    if ( function_exists( 'apache_request_headers' ) ) {
        $headers = apache_request_headers();
    } else {
        $headers = $_SERVER;
    }
    //Get the forwarded IP if it exists
    if ( array_key_exists( 'X-Forwarded-For', $headers ) && filter_var( $headers, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) ) {
        $the_ip = $headers;
    } elseif (array_key_exists('HTTP_X_FORWARDED_FOR', $headers ) && filter_var($headers, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
        $the_ip = $headers;
    } else {
        $the_ip = filter_var( $_SERVER, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 );
    }
    return $the_ip;
}

Как отдать на загрузку какой-либо файл на сервере с помощью php

универсальный загрузчик выглядит так

function download ($file) {
	if (!empty($file) and file_exists($file) and is_file($file)) {
		if (ob_get_level()) {
			ob_end_clean();
		}

		header('Content-Description: File Transfer');
		header('Content-Type: application/octet-stream');
		header('Content-Disposition: attachment; filename=' . basename($file));
		header('Content-Transfer-Encoding: binary');
		header('Expires: 0');
		header('Cache-Control: must-revalidate');
		header('Pragma: public');
		header('Content-Length: ' . filesize($file));
		
		if ($fd = fopen($file, 'rb')) {
			while (!feof($fd)) {
				print fread($fd, 1024);
			}
			fclose($fd);
		}
	} else {
		header('HTTP/1.0 404 Not Found');
		echo 'File not found';
	}
	exit();
}

С этим читают