Участник
- Сообщения
- 2,491
- Реакции
- 2,794
- Помог
- 61 раз(а)
Здраствуйте. Совсем недавно пользователь wopox1337 поднял отличную тему https://dev-cs.ru/threads/3592/. В продолжении темы хотелось бы расказать об опыте и тонкостях разработкы подобной системы. Но сначала краткое описание.
Данные мысли гуляли в умах многих. И мной предпринимались попытки несколько раз сделать подобное. Но все безуспешные ввиду утери рано или поздно интереса. Но в последний раз мной было снова начата разработка и позван Sonyx. Вместе мы начали разработку плана действий. Итого мы остановились на выборе микро-фреймворка на PHP Slim. Дальше я расскажу чем обусловлен данный выбор и какие проблемы он принес. Дальше к нам присоединились CrazyHackGUT, wopox1337, Pokemoshka, breakt, BoecSpecOPs, d3m37r4, h1k3, panikajo, SonG, oxoTHuk, Алексеич и AleXr. Работа закипела и начались первые трудности.
Трудность №1. Выбор языка. Так как от идеи в виде сервиса я решил отказаться и вести разработку в ключе self-hosted сервисов, то выбор очевиден - PHP. Он есть почти везде в отличии от других.
Трудность №2. Версия PHP. Так как формат системы CMS, то и учитывать нужно версии которые используются. И тут крайней версией стала 5.4 ниже которой спускаться уже нельзя. Но и это сильно старая версия, которая не поддерживается большинством компонентов из нашей системы. Посему выбор спал на PHP >= 5.6.
Трудность №3. Выбор фреймворка. В мире веб разработчиков давно существует правило не строить велосипеды. Самих фреймворков очень много, но лично для меня существуют только два самых популярных. Это Symfony и Laravel. Но так как это монструозные фреймворки хотелось что нибудь полегче. Из микро-фреймворков выбор падал на Slim, Silexи Lumen. Тут стоит учесть что Silex больше не разрабатывается, а Lumen поддерживает только PHP >= 7.1.3. В добавок тому что Slim поддерживает 5.4 еще понравилась концепция с middleware которая присуща в expressJS на NodeJS и которая мне сильно нравится. Но сам фреймворк состоит только из DI контейнера и роутера. Все остальное подключается через Composer. Посмотрев список дополнений я нашел почти все что нужно было. И выбор стал очевиден.
Трудность №4. Ничто так не разочаровывает как неудачный выбор. В итоге где то на 10% проекта стало известно что почти все те дополнения либо совсем не работают либо работают не так как нужно. Итого нами было переписано очень много (привет велосипедостроению), А именно работа с сессией, проверка CSRF (Сross Site Request Forgery) токена, авторизация и регистрация пользователей. Также были написаны с 0 компоненты форм и много чего еще.
Трудность №5. Авто-инсталлятор. Так повелось что все системы подобного рода имеют инсталлятор. А учитывая тот факт что мы пользуемся пакетным менеджером composer, то потребность в таковом просто необходима. Ведь обычные пользователи не сразу поймут как его установить и запустить, а учитывая что у многих хостинги, так и вовсе не получится. Итого был написан инсталлятор который умеет закачивать композер, устанавливать его, качать библиотеки, запускать миграции и создавать конфиг.
Продолжение следует. Продолжение.
По инициативе wopox1337, приведу кусок кода инсталятора composer-а
Конешно инсталятор еще нужно пилить и пилить, но пока что более мнее работает. И вот тут новые трудности
Трудность №6. Хостингы со своими проблемами. После скачивания самого композера его нужно распаковать. Для этого создается временной каталог. И как оказалось не везде есть доступ к записи туда. Пока данную проблему мы еще не решили, но скорей всего распаковывать будем внутрь себя самих.
Следующим постом будет выбор стурктуры проекта. Как появится свободное время распишу
Особые благодарности Sonyx за название GM-X и SonG за логотип, oxoTHuk за предоставление git репозитория.GM-X - это система управления игровыми серверами на движках GoldSrc и Source. Данная система с легкостью позволяет делать такие стандартные вещи как выдача привилегий та наказания игрока. Но в отличии от все существующих систем она не базируется на структуре базы AmxBans. Тем самым появляются дополнительные возможности, которые раньше добавлялись костылями. Вот некоторые из них:
Также стоит учесть, что все плагины общаются с базой через API вэб части. Это позволяет сократить количество запросов, а также убирает проблемы с кодировкой.
- Группы привилегий. Больше не нужно помнить какие флаги принадлежать випу или админу. Мы просто создаем группу и уже ее присваиваем игроку
- Игроку/Группе можно присвоить префикс в чате. Больше не нужно создавать конфиги на сервере. Все намного проще.
- Можно присвоить несколько групп одновременно. Может быть полезно если админку мы выдали сами, а вип - уже нужно покупать
- Пункт выше дает возможность сделать разные термины на разные привилегии на разных сервера. Это значит что игрок может иметь бесконечную админку, но вип у него будет на 10 дней. Но зато на другом нашем сервере он будет как простой игрок без привилегий
- Разные контакты. Теперь не нужно добавлять поля ВК или Скайп. Игрок сам может ввести свои контакты. Статус в разработке
- Теперь не нужно делать несколько таблиц для Бан/Гаг/Мут. Все это объединено в наказания.
Данные мысли гуляли в умах многих. И мной предпринимались попытки несколько раз сделать подобное. Но все безуспешные ввиду утери рано или поздно интереса. Но в последний раз мной было снова начата разработка и позван Sonyx. Вместе мы начали разработку плана действий. Итого мы остановились на выборе микро-фреймворка на PHP Slim. Дальше я расскажу чем обусловлен данный выбор и какие проблемы он принес. Дальше к нам присоединились CrazyHackGUT, wopox1337, Pokemoshka, breakt, BoecSpecOPs, d3m37r4, h1k3, panikajo, SonG, oxoTHuk, Алексеич и AleXr. Работа закипела и начались первые трудности.
Трудность №1. Выбор языка. Так как от идеи в виде сервиса я решил отказаться и вести разработку в ключе self-hosted сервисов, то выбор очевиден - PHP. Он есть почти везде в отличии от других.
Трудность №2. Версия PHP. Так как формат системы CMS, то и учитывать нужно версии которые используются. И тут крайней версией стала 5.4 ниже которой спускаться уже нельзя. Но и это сильно старая версия, которая не поддерживается большинством компонентов из нашей системы. Посему выбор спал на PHP >= 5.6.
Трудность №3. Выбор фреймворка. В мире веб разработчиков давно существует правило не строить велосипеды. Самих фреймворков очень много, но лично для меня существуют только два самых популярных. Это Symfony и Laravel. Но так как это монструозные фреймворки хотелось что нибудь полегче. Из микро-фреймворков выбор падал на Slim, Silexи Lumen. Тут стоит учесть что Silex больше не разрабатывается, а Lumen поддерживает только PHP >= 7.1.3. В добавок тому что Slim поддерживает 5.4 еще понравилась концепция с middleware которая присуща в expressJS на NodeJS и которая мне сильно нравится. Но сам фреймворк состоит только из DI контейнера и роутера. Все остальное подключается через Composer. Посмотрев список дополнений я нашел почти все что нужно было. И выбор стал очевиден.
Трудность №4. Ничто так не разочаровывает как неудачный выбор. В итоге где то на 10% проекта стало известно что почти все те дополнения либо совсем не работают либо работают не так как нужно. Итого нами было переписано очень много (привет велосипедостроению), А именно работа с сессией, проверка CSRF (Сross Site Request Forgery) токена, авторизация и регистрация пользователей. Также были написаны с 0 компоненты форм и много чего еще.
Трудность №5. Авто-инсталлятор. Так повелось что все системы подобного рода имеют инсталлятор. А учитывая тот факт что мы пользуемся пакетным менеджером composer, то потребность в таковом просто необходима. Ведь обычные пользователи не сразу поймут как его установить и запустить, а учитывая что у многих хостинги, так и вовсе не получится. Итого был написан инсталлятор который умеет закачивать композер, устанавливать его, качать библиотеки, запускать миграции и создавать конфиг.
Продолжение следует.
19 Ноя 2018
По инициативе wopox1337, приведу кусок кода инсталятора composer-а
PHP:
function downloadComposer($dir) {
return file_put_contents($dir . DS . 'composer.phar', file_get_contents('https://getcomposer.org/composer.phar')) !== false;
}
function extractComposer($dir) {
$composerPhar = new Phar($dir . DS . 'composer.phar');
return $composerPhar->extractTo($dir);
}
function rrmdir($dir) {
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != '.' && $object != '..') {
if (is_dir($dir . DS . $object))
rrmdir($dir . DS . $object);
else
unlink($dir . DS . $object);
}
}
rmdir($dir);
}
}
function composerInstall() {
$tempDir = sys_get_temp_dir() . DS . uniqid('GameX', true) . DS;
if (!is_dir($tempDir)) {
if (!mkdir($tempDir, 0777, true)) {
throw new Exception('Can\'t create folder ' . $tempDir);
}
}
if (!downloadComposer($tempDir)) {
throw new Exception('Can\'t download composer to ' . $tempDir);
}
if (!extractComposer($tempDir)) {
throw new Exception('Can\'t download composer to ' . $tempDir);
}
require_once($tempDir . 'vendor' . DS . 'autoload.php');
chdir(BASE_DIR);
// https://getcomposer.org/doc/03-cli.md#composer-vendor-dir
putenv('COMPOSER_HOME=' . $tempDir . 'vendor/bin/composer');
putenv('COMPOSER_VENDOR_DIR=' . BASE_DIR . 'vendor');
putenv('COMPOSER_BIN_DIR=' . BASE_DIR . 'vendor/bin');
$input = new \Symfony\Component\Console\Input\ArrayInput(['command' => 'install']);
$output = new \Symfony\Component\Console\Output\NullOutput();
$application = new \Composer\Console\Application();
$application->setAutoExit(false);
$application->run($input, $output);
rrmdir($tempDir);
}
Конешно инсталятор еще нужно пилить и пилить, но пока что более мнее работает. И вот тут новые трудности
Трудность №6. Хостингы со своими проблемами. После скачивания самого композера его нужно распаковать. Для этого создается временной каталог. И как оказалось не везде есть доступ к записи туда. Пока данную проблему мы еще не решили, но скорей всего распаковывать будем внутрь себя самих.
Следующим постом будет выбор стурктуры проекта. Как появится свободное время распишу
Последнее редактирование: