Как стать автором
Поиск
Написать публикацию
Обновить

Пишем гостевую с использованием Memcached

Добрый день! Сегодня мы будет делать простую гостевую на PHP с использованием MySQLi и Memcache.
Внимание! Все что я делал, я тестировал на OpenServer.

1. Подключение к БД

Создадим файл system/connect.php

<?php
$db = new mysqli('localhost', 'root', '', 'mini-chat') or die('Ошибка подключения к БД');
?>


2. Создание таблиц

Создадим таблицу `posts`

CREATE TABLE IF NOT EXISTS `posts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` text NOT NULL,
  `message` text NOT NULL,
  `time` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


3. Подключение Memcached

Внимание, для использования Memcache сначала необходимо включить этот модуль в настройках: Настройки -> Модули -> Memcached

Создадим файл system/memcache.php

<?php
$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11211) or dir('Ошибка соединения с Memcached');
?>




4. Форма отправки сообщения

В данном файле у нас будет форма отправки сообщения

Создадим файл system/form.php

<form method="POST">
	Имя:<br />
	<input type="text" name="name" placeholder="Ваше имя..." value /><br />
	
	Сообщение:<br />
	<textarea name="message" placeholder="Ваше сообщение..."></textarea><br />
	
	<input type="submit" name="send" value="Отправить сообщение" />
</form>


5. Обработчик формы (Отправка сообщения)

Создадим файл system/query.php

<?php
if (isset($_POST['send'])) {
	$name = isset($_POST['name']) ? trim($_POST['name']) : null;
	$message = isset($_POST['message']) ? trim($_POST['message']) : null;
	
	if (empty($name) or mb_strlen($name) > 24) {
		$error = true;
		$errors[] = 'Недопустимая длина имени!';
	}
	
	if (empty($message) or mb_strlen($message) > 5000) {
		$error = true;
		$errors[] = 'Недопустимая длина сообщения!';
	}
	
	if ($error == false) {
		$query = $db->query('INSERT INTO `posts` (`name`, `message`, `time`) VALUES ("'.$db->real_escape_string($name).'", "'.$db->real_escape_string($message).'", "'.TIME.'")');
		if ($query == true) {
			echo '<h1>Сообщение отправлено!</h1>';
		} else {
			$error = true;
			$errors[] = 'Ошибка отправки сообщения!';
		}
	}
}
?>


6. Вывод постов

Здесь у нас самое интересное. Я подробно опишу каждую строку из кода.

Создадим файл system/posts.php

<?php
$query = $db->query('SELECT `id` FROM `posts` ORDER BY `id` DESC'); # Запрос на выбор всех ID из таблицы
$list = $query->fetch_row();
$count = count($list); # Считаем кол-во записей

for($i = 0; $i < $count; ++$i) {
	$query = 'SELECT * FROM `posts` WHERE `id` = '.$list[$i]; # Запрос на выборку всех данных из таблицы по ID
	$post = $memcache->get(md5($query)); # Пытаемся найти данные в кэше
	$from = 'Cache'; # Сообщения для наглядности
	if (empty($post)) { # Если данных в кэше нет
		$post = $db->query($query)->fetch_assoc(); # Получаем данные из БД
		$memcache->add(md5($query), $post, false, 3600); # Запишем данные в кэш без компрессии на 1 час
		$from = 'DB'; } # Сообщения для наглядности
	
	echo '<div class="post">
		Имя: '.$post['name'].'<br />
		Сообщение: '.out_text($post['message']).'<br />
		From: '.$from.'<br />
	</div>';
}

# $memcache->flush() - эта функция удаляет все кэшированные данные.
?>


7. Файл с функциями

Здесь у нас всего одна функция, но я ее решил вынести в отдельный файл.

Создадим файл system/functions.php

<?php
function out_text($text) {
	return nl2br(htmlspecialchars($text));
}
?>


8. Шапка и ноги сайта

Нужно это или нет, но я решил создать ещё парочку файлов))

Шапка

Здесь у нас вывод ошибок. Файл: system/header.php
<?php
if (is_array($errors) and count($errors)) {
	$count_errors = count($errors);
	for($i = 0; $i <= $count_errors; ++$i) {
		echo $errors[$i].'<br />';
	}
}
?>

И ноги сайта, файл system/footer.php — здесь пока пусто)

9. Собрать все в кучу (index.php)

Теперь все вышеперечисленное нужно склеить!

Создадим файл index.php

<?php
define('ROOT', dirname(__FILE__));
define('TIME', $_SERVER['REQUEST_TIME']);

$error = false;
$errors = array();

require(ROOT.'/system/connect.php');
require(ROOT.'/system/memcache.php');
require(ROOT.'/system/functions.php');
require(ROOT.'/system/query.php');
require(ROOT.'/system/header.php');
require(ROOT.'/system/form.php');
require(ROOT.'/system/posts.php');
require(ROOT.'/system/footer.php');
?>
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.