В последнее время появилось очень много юных талантов, желающих создать собственную MMORPG-игру. Что они делают в первую очередь? Естественно, берут первую-лучшую книжечку по PHP + MySQL. Это в принципе неплохой выбор, но неужели это всё, что нужно для создания отличной игры?
Ответ предсказуем - нет, и сегодня мы рассмотрим на теории и практике всё, что пригодится для создания приличного отказоустойчивого приложения.
Итак, вы взяли PHP. Пожимаю вашу руку - на самом деле это неплохой выбор, несмотря на количество фотожаб про "похапэ ацтой". Можете успокоиться, на самом деле в этом скриптовом языке программирования есть довольно таки широкий инструментарий для решения необычных задач, а также огромное количество модулей, о многих из которых вы даже не догадываетесь.
Давайте вскроем среднестатистический исходник WAP-игры на PHP (кроме WAP мало что можно найти). Что мы там видим?
Код
$handle = mysql_query($conn, "SELECT * FROM `chars` WHERE `name` = '". $_POST['login'] ."' LIMIT 0,1"); $data = mysql_fetch_array($handle); echo "Level: ". $data['lvl'] ." \n дальше мне было лень писать, сами поймёте ";
"Что здесь плохого, кроме твоего комментария?", - спросит среднестатистический кодер. А я вам объясню, даже по пунктам.
Не проводится проверка данных, подставляется прямо в запрос (спокойно можно сделать иъекцию, введя логин ' OR '1' = '1)
Устаревшие функции MySQL
Вывод прямо на страницу. Иногда это не лучший вариант, особенно при использовании шаблонизатора
Без ООП. Это необязательно, но лучше с ним
Запомните первое - необходимо объект-ориентированное программирование. Что вы сделаете одними запросами и функциями? Мало чего стоящего. Уверяю вас - надо использовать классы. Учите ООП, оно вам пригодится не только здесь, в php, но и в других ЯП, если вы будете их изучать.
Главная ошибка при использовании ООП - это постоянный include всех необходимых классов. Запомните раз и навсегда - необходимо загружать лишь те классы, которые точно будут использоваться. Для этого создана автозагрузка классов. Пример загрузчика:
Вряд ли следует объяснять смысл данного когда. Функцией spl_autoload_register регистрируется автозагрузчик классов. Выбранная функция вызывается тогда, когда создаётся экземпляр класса (new ClassName), который не был объявлен. Так что теперь вы можете спокойно помещать каждый класс в отдельный файл папки classes. Можно регистрировать и несколько таких функций, но желательно обойтись одной, ибо смысл множить их? Засоряют.
Второе, что вам обязательно нужно знать - запросы надо кэшировать. Если у вас онлайн в дюжину игроков, и каждое действие игрока провоцирует 50 запросов к БД, рано или поздно сервер заплачет и упадёт. Поэтому часто выполняемые запросы надо кэшировать. Один из хороших примеров расширений для кэша - Memcache. Он хранит данные на уровне оперативной памяти в виде таблицы ключ-значение. Это удобно.
Код
$memcache = new Memcache; $memcache->connect('localhost', 11211) or die ("Не могу подключиться");
$tmp_object = new stdClass; $tmp_object->str_attr = 'test'; $tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 10) or die ("Ошибка при сохранении данных на сервере"); echo "Данные сохранены в кеше. (время жизни данных 10 секунд)<br/>\n";
$get_result = $memcache->get('key'); echo "Данные из кеша:<br/>\n";
var_dump($get_result);
// пример кода взят с официальной документации
Смысл этого кода также понятен интуитивно. Мы сохраняем данные на 10 секунд в память memcache. Естественно, на практике надо ставить срок побольше. Теперь мы можем кэшировать даже запросы.
В данном примере мы сохраняем текст запроса. Потом шифруем его в md5 и полученный ключ ищем в памяти. Нет - делаем запрос к БД и сохраняем в кэш, есть - просто возвращаем. Итог - вместо 100500 запросов каждую минуту от кучи пользователей он производится лишь раз в час.
Даже это избавит вашу игру от многих вылетов и падений. Достаточно ли этого? Нет. Игру можно оптимизировать хоть до конца жизни, используя всё новые и новые технологии. Следующее, о чём вам надо знать - это веб-сокеты, которые создают непрерывное соединение клиента и сервера. В php для развёртывания такого сервера используется функция stream_socket_server, однако об этом мы поговорим в следующей статье (можно было вложиться и в одну, но хорошего должно быть понемногу).
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «MMORPG на PHP: ООП и кэширование», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.
Данная статья почти ни коем образом не затрагивает тему MMORPG. ООП и кэширование, в частности ООП, используется почти всеми хорошими PHP программистами. Кэширование желательно использовать для нагруженных систем, а не только в MMO.
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]