может у тебя не запущен сервер?skype, wmware workstation, IIS-службы порты такие же юзают, как apache Я лично юзаю openserver, он в лог ошибку пишет подробную какой процесс не дает запустить серв
Сообщение отредактировал liker - Среда, 26 Декабря 2012, 20:03
у тебя какой браузер?тебе нужно омнибокс отрубить, В хроме это Включить Живой поиск, чтобы ускорить поиск данных (введенные в омнибокс данные могут регистрироваться) в настройках
Сообщение отредактировал liker - Среда, 26 Декабря 2012, 19:50
Добавлено (15.12.2012, 09:22) --------------------------------------------- больше почему то не могу в тему дописывать, видно тут лимит на количество символов, надо новую тему сделать
Создание ООП движка-фреймворка для браузерный игры Кому полезен могут быть эти уроки? Людям, которые знают основы php, включая ООП. Что необходимо знать(основы) для понимания того, что здесь будет написано? PHP, Mysql, JS, HTML, CSS, AJAX Что будет написано в конечном итоге?
Движок(фреймворк) - каркас, на котором можно писать браузерные игры и, возможно, сама игра(с вашими идеями). Движок будет модульным, т.е. необходимые файлы будут подключаться по мере необходимости.
Сами модули - авторизация/регистрация, добыча ресурсов и тд
Защита от инъекций(PDO - подробнее далее), защита от межсайтовых атак и от скриптинга
i10n - интернациональность - возможность быстрого переключения между языками игры(т.е. в настройках указываем к примеру english или russian, и у нас движок подгружает соответствующий файл перевода)
Визуальная часть(не уверен что красиво сделаю, я не дизайнер :))
Чат с командами для модераторов и админов Чего точно не будет? Не будет шаблонизатора - скрипта, который позволяет красиво вписывать php код в html(кто захочет, сам легко это сделает) Что особенного будет в данных уроках?
ООП - большинство уроков остаются пока-что функциональными + минимум паттернов(я в них сам новичок)
Большое внимание защиты
Использование только поддерживаемых функций(не будет устаревших)
Немного поиграем с сессией(переопределим хранение, и способ формирование идентификатора - нужно для повышения защиты)
Напишем свой мини-логгер(скрипт, который пишет в текстовые файлы информацию об атаках, об неправ. запросах и тд)
Еще придумаю
Программное обеспечение:
В качестве сборки сервера я использую OpenServer(У вас может быть Denwer, XAMPP), OS Windows 7 x64(не принципиально)
PHP 5.3
Mysql 5.5
Программа, где пишу код - NetBeans IDE(не принципиально)
Веб-сервер Apache 2.2
Интерфейс подключения к бд - PDO(не пугайтесь там все очень просто). Функции mysql_query и mysql_connect использовать не будем, это устарелый подход и они признаны разработчиками устаревшими.
Урок 1. Введение и теория. Что же, начнем со структуры: Файловая структура: Папка, которую читает веб-сервер - public_html(у вас может быть www, public, htdocs, html, htmls, publics) - не принципиально Содержание папки public_html
Главный файл - index.php - именно он ВСЕГДА будет первым вызывается сервером
.htaccess - настройки для веб-сервера, которые нам необходимы
папка assets - в ней будут наши стили(css), javascript, и картинки
Остальные папки, которые лежат на одном уровне с public_html
Папка App(от Application)- в ней лежат controllers, models, views(тоже не пугайтесь, ничего сложного)
Папка App/Data - в ней лежат, квесты, итемы, информация об игроках
Папка Sessions - в ней лежат файлы сессии
Папка Logs - в ней лежат логи
Папка System - собственно папка, в которой лежит наш фреймворк(движок)
Папка Users в ней лежат данные об игроках(ресурсы и тд). Это не значит что данные мы не будем хранить в бд Подробнее в след. уроках
Папка public_html/Assets - в ней лежат, как видно на скриншоте, js, css, i(картинки)
Папка App/i10n(international) - языковые файлы(перевод надписей и тд)
Скриншот - как это выглядит:
У веб-сервера есть доступ только к папке public_html, поэтому папки application, system, logs, sessions, data, users не доступны извне (Веб-сервер смотрит только папку public_html)
Немного теории, ничего сложного: MVC- model view controller - схема, при которой мы наш код разделяем на 3 части: запросы к бд+вычисления(model), вывод html/js - view, controller - объект, который обеспечивает взаимодействие между model и view. Не бойтесь названий, это просто названия Мы просто делим код на 3 части: Запросы к бд(model) - mysql Вывод информации(view) - html/js "Главный файл", который объединяет запрос и вывод(controller) Схема MVC, применительно для нашего движка:
Controller - это файл, в котором происходят основные действия(принятие данных, подготовка данных к запросу бд, передача данных в html-файл(view)) У контроллера есть action(действие), т.е. это метод класса, (action всегда public), который мы вызываем из браузерной строки Имя класса = Controller_Имя контроллера, т.е. скажем у нас есть адрес http://test.ru/game/inventory game - это имя контроллера, класс будет называться Controller_Game, action - inventory(показать инвентарь игрока) Model - это файл с запросами к бд(+возможно, вычиления) View - это html файл формата .php, в котором мы с помощью php кода выводим данные Файлы(Классы) из которых будет состоять движок: index.php - главный входной файл Папка System: core.php - ядро request - принятые данные, ip-адрес юзера, очистка принятых данных от опасных данных response - исходящие данные, установка заголовков, перенаправление, 404 ошибка session - работа с сессией router - сопоставление имени файлов и классов в зависимости от параметров строки браузера(роутер) databasel - бд filemanager - работа с файлами lang - класс работы с языком logger - запись критических действий пользователя view - класс работы с представлениями(view) Все остальные файлы - чат, добыча ресурсов, прокачка перса и тд являются классами и хранятся в папке app/classes Последовательность работы движка:
Файл index.php устанавливает необходимые настроки (язык, временная зона, константы, конфиги, включает буферизацию вывода) и загружает файл core.php(require)
В файле core.php содержатся основные действия. Класс Core загружает остальные необходимые файлы: Session, Request, Response, Logger, Router, Database.. и тд, которые находятся в других файлах в той же папке(system)
Класс Router берет данные из браузерной строки, и в зависимости от того, что там, загружает нужный файл(контроллер)
В зависимости от написанного нами кода, вызванный контроллер обращается к модели(бд), берет данные и выводит их в View(html)
Скрипт заканчивается тем, что движок посылает заголовки ответа(Response) в браузер клиента
А теперь все это визуально
Итак, теперь как это ОКОНЧАТЕЛЬНО будет выглядеть:
Папка application - в ней содержатся наши controllers, models, view, modules
Папка data - квестый, файлы игроков
Папка logs - логи
Папка sessions - сессии
Папка system - классы движка, внимание классы Core, Controller, Model, View содержатся в файле core.php!(так удобнее мне, но можно вынести и в отд файлы)
Папка public_html - папка, которую "смотрит" веб-сервер, в ней наш файл index.php
index.php
Код
<?php /** * The framework for browser game * @author Liker * @copyright (c) 2013, Liker * @version 1.0.13.01.23 * @filesource index.php */
//Development or working project define('DEV', 1);
if (DEV) { define('START_TIME', microtime(true)); define('START_MEMORY', memory_get_usage());
//Pathes to main files, also SYSPATH variable is needed to protect against direct calls *.php files define('DOCROOT', __DIR__.DS); define('APPPATH', realpath('../app').DS); define('SYSPATH', realpath('../system').DS); define('LOGPATH', realpath('../logs').DS); define('DATAPATH', APPPATH.'data'.DS); define('USERPATH', realpath('../users').DS);
//Settings for routing define('DEFAULT_ACTION', 'index'); define('DEFAULT_CONTROLLER', 'welcome');
//This function call costs ~0.006 sec(6 ms), so long... //setlocale(LC_ALL, 'ru_RU.utf-8');
require SYSPATH.'Core'.EXT;
//Set language (i10n) and run engine Core::getInstance() ->setLanguage('russian') ->execute(); ?>
.htaccess - все запросы направляются на файл index.php (т.е. запросы типа site.ru/index.php; site.ru/index; site.ru/just.php будет обрабатывать всегда файл index.php)
Строка RewriteCond %{REQUEST_URI} !\.(css|gif|ico|jpg|js|png)$ обязательна, если вы перенаправляете любой запрос на index.php(ну или другой файл), т.к. современные браузеры запрашивают favicon.ico(маленькая иконка сайта) и этот запрос на favicon тоже перенаправляется на index.php, соответственно проходит 2 запроса вместо одного, изза этого могут возникнуть проблемы работы(я 3 дня мучался один раз), + лишняя нагрузка никому не нужна.
Урок 2. Mysql(PDO) Итак, для работы с бд мы будем использовать интерфейс PDO для работы с базой данных. У него есть преимущества перед функциями mysql_connect, mysql_query и т.п.: - он поддерживатся разработчиком - в нем теоретически невозможна SQL-инъекция(на практике не сталкивался) - работает быстрее Итак, внешне от mysql_connect и т.п. особо не отличается, пишем такие же запросы, просто немного меняется синтаксис команд Класс mysql mysql.php(находится в папке system)
Код
<?php if( ! defined('SYSPATH')) exit('No direct script access allowed'); /* * To change this template, choose Tools | Templates * and open the template in the editor. */
/** * * @author Liker */ class Database { public $STH = null; public $DBH = null;
private static $_instance = null;
private function __construct() { $this->connect(); } private function __clone(){} private function __wakeup(){}
public static function getInstance() { if (empty(self::$_instance)) { self::$_instance = new self; } return self::$_instance; } public function connect() { try { $this->DBH = new PDO("mysql:host=127.0.0.1;dbname=game", 'root', ''); $this->DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); $this->DBH->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); } catch (PDOException $e) { Logger::write($e->getMessage(), 'pdo'); Response::sendStatus(500, 'Mysql error'.$e->getMessage()); } } public function close() { $this->STH = null; $this->DBH = null; }
}
?>
Singleton Вы наверно уже заметили, что в коде постоянно фигурируют функции getInstance() и объекты нигде не создаются напрямую через Cat = new Cat()//пример Такой прием(шаблон, паттерн) называется Singleton(одиночка) Это означает, что у класс может быть ТОЛЬКО ОДИН экземпляр объекта. Это нужно для того, чтобы не размножать объекты: например, мы по ошибке создали 2 объекта типа mysql, тогда у нас получится 2 соединения с бд, а это не есть хорошо. Пример Синглтон предотвращает от этого. Если объекта нет, то он его создает, если есть, то просто возвращает на него ссылку Методы private function __construct(){} private function __clone(){} становятся private(закрытыми) и теперь нельзя напрямую создать объект, а только через функцию getInstance(); Таким образом мы создадим большинство классов.
Уроки буду делать дальше
Сообщение отредактировал liker - Понедельник, 11 Марта 2013, 10:51
Я даже не думал об этом, я хочу пока не конкретную игру, а движок, и потом, если все получится, то уже и игру Жду еще ответов, а то пока что соотношение просмотров и ответов мало
ну так я и говорю, если данные из браузерной строки не фильтруются то возможно думаю сломать, а если фильтруются то все окей, само по себе так тупо в лоб подключиться к бд нельзя
у вас файлы грузятся в зависимости от того, что передано в браузерной строке? проверяете на допустимые имена, если нет, то показывайте страница не найдена
Некоторые юзеры пишут на форуме уроки по созданию браузерных игр, я тут подумал, может мне тоже что-нибудь такое написать? Думаю написать движок для браузерной игры(некий каркас), а если уроки будут популярный и то саму игру. Прошу отписаться в теме, кому будет интересно, но говорю сразу, что буду стараться писать "красивый" код + ООП+некоторые приемы программирования. Вообщем, прошу написать ваше мнение, стоит ли начинать
Сообщение отредактировал liker - Воскресенье, 09 Декабря 2012, 15:36