Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356

Реализация Онлайна на сайте php+mvc

06.04.2016, 19:52. Показов 2385. Ответов 44
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю онлайн, нужно каждый раз как человек переходит на страницу в БД записывать данные.

Вот как сделать так что бы не писать в каждом контроллере каждой страницы лишний код.
Пробовал в основном котроллере через конструктор в итоге не лучшая идея.
Читал про singleton , вычитал только море критики в его сторону
Подскажите пожалуйста как такое реализовать можно?

PS: делать какое то действие на каждой странице , при это не писать лишнего в наследуемых контроллерах
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.04.2016, 19:52
Ответы с готовыми решениями:

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

Реализация autoload на mvc
Подскажите как мне избавится от include в моем маршрутизаторе, и реализовать функцию autoload для автоматической загрузки классов. Вот мой...

Реализация паттерна MVC
Доброго времени суток. Допустим у меня есть класс Database в котором 2 метода: class Database { public OleDbConnection...

44
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,229
06.04.2016, 20:06
1 класс = 1 шаблон
в каждом свои блоки
уверены, что у вас так не получается?
0
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
06.04.2016, 20:11  [ТС]
полудух, Все так и есть
1 model.php 1 contoroller.php 1 View.php
И так на каждую страницу.
Но теперь смотрите мне нужно на каждой такой странице Делать одно и тоже действие. И писать в ручную в каждом наследуемом контроллере не самая лучшая идея. А вдруг у меня будет 500 страниц 500 файлов? а потом что то поменять захочу

Или я не совсем так понял?
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,229
06.04.2016, 20:14
шаблон != страница
шаблон 1 на 100500 страниц
страница товара это шаблон, а товаров тысячи
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
06.04.2016, 20:37
Цитата Сообщение от полудух Посмотреть сообщение
1 класс = 1 шаблон
Какой класс? Шаблоны — это лишь HTML-код с логикой отображения. Зачем шаблон в класс запихивать?
Цитата Сообщение от maruo Посмотреть сообщение
Читал про singleton , вычитал только море критики в его сторону
Singleton тут вообще ни в какие ворота не лезет. И какая критика?

Вам нужно сделать какой-то обработчик событий. Чтобы он вызывался при каждом запросе. К контроллерам он отношения не имеет, это отдельная штука.
0
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
06.04.2016, 20:50  [ТС]
Цитата Сообщение от Para bellum Посмотреть сообщение
Singleton тут вообще ни в какие ворота не лезет. И какая критика?
ну типо я в основном контроллере запустил Конструктор, а он ведь запускается каждый раз при создании объекта.
А мне нужно было 1 раз только.Поэтому наткнулся на синглтон.

Вот какой обработчик событий? Не Front_controoler ли?И даже если так , то слабые у меня пока познания в ООП
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,229
06.04.2016, 21:27
Цитата Сообщение от Para bellum Посмотреть сообщение
Какой класс? Шаблоны — это лишь HTML-код с логикой отображения. Зачем шаблон в класс запихивать?
потому что я не люблю этот бред с <?php ... ?> по 100500 раз на страницу
+ нужные блоки так удобнее в одном файле все в кучу собирать
+ отдельный файл с шаблоном = доп.время на его загрузку
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
06.04.2016, 22:08
Цитата Сообщение от maruo Посмотреть сообщение
Вот какой обработчик событий?
Например:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class Event {
 
    /*
    * @var Массив слушателей событий
    */
    protected static $listeners = [];
    
    /*
    * @var Массив запущенных событий
    */
    protected static $firing = [];
    
    /*
    * Блокируем создание объектов класса
    */
    private function __construct() {}
    
    /*
    * Подписка на событие
    * 
    * @param string $event — имя события, на которое подписываемся
    * @param Closure $callback — анонимная функция-обработчик
    *
    * @return void
    */
    public static function subscribe($event, Closure $callback) {
        # Добавляем подписку на обработку
        self::$listeners[$event][] = $callback;
    }
    
    /*
    * Запуск события
    * 
    * @param string $event — имя события, которое возбуждаем
    * @param array $parameters — дополнительные данные для передачи в функцию
    *
    * @return void|null
    */
    public static function fire($event, array $parameters=[]) {
        # Если данное событие уже есть в массиве
        if(isset(self::$firing[$event]))
            return;
            
        # Добавляем событие
        self::$firing[$event] = $parameters;
    }
    
    public static function handle(){
        # Обходим возбуждённые события
        foreach(self::$firing as $event=>$parameters){
            # Если на это событие нет подписок
            if(!isset(self::$listeners[$event]))
                return;
            
            # Обходим массив функций, которые нужно вызвать
            foreach(self::$listeners[$event] as $callback)
                # Вызываем обработчик события
                $callback($parameters);
        }
    }
}
Пример подписки на событие (пишете там, где Вам удобно; вне котроллеров):
PHP
1
2
3
Event::subscribe('activity', function(){
    # Тут выполняете обновление в базе
});
Где-нибудь, при обработке маршрутов пишете:
PHP
1
Event::fire('activity');
Затем в конце работы приложения запускаете обработку:
PHP
1
Event::handle();
И всё. На одно событие можно "повесить" хоть тысячу обработчиков.
1
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
07.04.2016, 10:49  [ТС]
Para bellum, Ваш пример очень похож на паттерн singleton, во всяком случае спасибо за подробности буду пробовать

Добавлено через 12 часов 25 минут
Цитата Сообщение от Para bellum Посмотреть сообщение
Затем в конце работы приложения запускаете обработку:
Вот это не понятно, где в конце?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
07.04.2016, 12:48
Цитата Сообщение от maruo Посмотреть сообщение
Вот это не понятно, где в конце?
Честно говоря, сложно сказать... Зависит от структуры Вашего приложения.
0
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
07.04.2016, 13:14  [ТС]
Para bellum, Сложно вообще понимаю как это работает, вот попробовал запихал для теста все в роутер
У меня остальной код не отрабатывает после
PHP
1
Event::handle();
К тому же в БД летит больше 6ти записей

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
class Router{
 
  public static function Start(){
    //Параметры по умолчанию
    $controller_name = 'index';
    $action_name = 'index';
    $action_parameters = array();
 
    $route_array  = explode('/', $_SERVER['REQUEST_URI'],4);
    if (!empty($route_array[1])) {
      $controller_name = $route_array[1];
    }
    if (!empty($route_array[2])) {
      $action_name = $route_array[2];
    }
    if(!empty($route_array[3])){
      $action_parameters = explode('&', $route_array[3]);
    }
 
    $model_name = 'Model_'.$controller_name;
    $controller_name = 'Controller_'.$controller_name;
    $action_name = 'Action_'.$action_name;
 
    if(file_exists(F_PATCH.'/system/model/'.$model_name.'.php')){
      include F_PATCH.'/system/model/'.$model_name.'.php';
    }
    if(file_exists(F_PATCH.'/system/controller/'.$controller_name.'.php')){
      include F_PATCH.'/system/controller/'.$controller_name.'.php';
    }else{
      header("Location: /index");
    }
 
    if(method_exists($controller_name,$action_name)){
      $controller = new $controller_name();
      $controller->$action_name($action_parameters);
    }else{
      header("Location: /index");
    }
 
    Event::fire('activity');
    if(!empty($_SESSION['auth'])){
      Event::subscribe('activity', function(){
        include_once"connect_bd.php";
        $time_last_active = time();
        $insert_time_last_active = mysqli_query($link,"INSERT INTO recent_activity (user_id,user_ip,last_date_activity)
                                                              VALUES ('$user_id','$ip','$time_last_active')
                                                              ")or die(mysqli_error($link));
      });
    }
    Event::handle();
 
 
 
 
 
 
  }
}
Добавлено через 8 минут
Ай ладно х. с ним, забейте
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
07.04.2016, 13:32
1) Зачем Вы подключаете соединение с базой в функции (include_once)? Лучше сделайте подключение один раз на всё приложение.
2) Заместо "$time_last_active" можно использовать функцию NOW() прямо в запросе.
3) Убивать приложение (die) не надо. Не критично ведь. Да и вообще никогда не надо, лучше всегда обрабатывать ошибки.
Ну это так, к слову.
Цитата Сообщение от maruo Посмотреть сообщение
К тому же в БД летит больше 6ти записей
В смысле? Как это, больше шести?
0
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
07.04.2016, 13:42  [ТС]
Para bellum, Да фиг его знает, почему больше шести летит.Обновляют 1 раз страницу а в чистой бд Уже 6+ записей (точно не подсчитывал)
Есть предположение что аякс это делает хотя тоже уверенным быть не могу

Добавлено через 3 минуты
Цитата Сообщение от Para bellum Посмотреть сообщение
Зачем Вы подключаете соединение с базой в функции (include_once)? Лучше сделайте подключение один раз на всё приложение.
Да потому что чем больше файлов у меня с классами , больше путаюсь в этом MVC, а тут я знаю, что соединился и хорошо все будет.

Добавлено через 45 секунд
Цитата Сообщение от Para bellum Посмотреть сообщение
3) Убивать приложение (die) не надо. Не критично ведь. Да и вообще никогда не надо, лучше всегда обрабатывать ошибки.
Так я вижу где ошибка произошла, и как ее исправить
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
07.04.2016, 14:37
Цитата Сообщение от maruo Посмотреть сообщение
Обновляют 1 раз страницу а в чистой бд Уже 6+ записей
Посмотрите в консоли обозревателя, какие запросы идут. Возможно, ещё он автоматом файл "favicon.ico" запрашивает и перенаправление идёт в index.

Добавлено через 8 минут
Цитата Сообщение от maruo Посмотреть сообщение
Да потому что чем больше файлов у меня с классами, больше путаюсь в этом MVC, а тут я знаю, что соединился и хорошо все будет.
Лучше сделать надстройку над драйвером базы данных и использовать её объект. Тогда всё сведётся к подобному:
PHP
1
DB::query('запрос');
Таким образом, делая подобный запрос, мы точно знаем, что соединение с базой присутствует.
1
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
07.04.2016, 15:04  [ТС]
Para bellum,

Я так полагаю это делает кучу запросов?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
07.04.2016, 15:20
Цитата Сообщение от maruo Посмотреть сообщение
Я так полагаю это делает кучу запросов?
Получается так. Надо искать, почему столько запросов. Это отразится не только на событиях, а вообще, на всём приложении.
К чему Вам сайт-камикадзе, который сам себя атакует множеством лишних запросов...

Добавлено через 1 минуту
Насчёт события пометки "Онлафн". Лучше, прежде, чем делать запрос, проверить, когда последний раз ставилась метка. Ни к чему при каждом запросе базу дёргать. Сделайте так, чтобы метка ставилась раз в десять минут, хотя-бы.
0
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
07.04.2016, 15:28  [ТС]
Para bellum, во точно то что вы сказали, эти запросы решили проблему)теперь только 1 запись летит в бд)
ТОлько проблема не в favicon.ico, а с JS он искал нужную себе библиотеку и не находил ее поэтому посылал запросы
Но проблема с тем что код после не отрабатывает осталась?Это наверно потому что надо поставить этот кусок в самый конец? ТОесть во вьюху?
PHP
1
Event::handle();
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
07.04.2016, 15:35
Цитата Сообщение от maruo Посмотреть сообщение
Но проблема с тем что код после не отрабатывает осталась?
Включите вывод всех ошибок. Может отобразится что. "handle" вообще ничего особого не делает — только вызывает Ваши подписки на событие.
В Вашей функции-подписке тоже нет ничего особого, разве что "die" срабатывает.

Добавлено через 1 минуту
Цитата Сообщение от maruo Посмотреть сообщение
ТОесть во вьюху?
Это не дело вида. Это дело приложения. Так что в виде вызывать обработку событий не надо.
0
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
07.04.2016, 15:40  [ТС]
Para bellum, вывод всех ошибок стоит вот именно, просто пустота и ничего нет)
Так вот летит запрос в бД, а если я уберу Event::handle(); в другое место любое, то запрос не летит, но все остальное отрабатывает как надо. Ошибки повторяюсь включены полностью ничего нету
Если бы я еще понимал как работает ваш код, я бы не задавал столько вопросов, так что уж извините))
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class Router{
 
  public static function Start(){
    //Параметры по умолчанию
    $controller_name = 'index';
    $action_name = 'index';
    $action_parameters = array();
 
    $route_array  = explode('/', $_SERVER['REQUEST_URI'],4);
    if (!empty($route_array[1])) {
      $controller_name = $route_array[1];
    }
    if (!empty($route_array[2])) {
      $action_name = $route_array[2];
    }
    if(!empty($route_array[3])){
      $action_parameters = explode('&', $route_array[3]);
    }
 
    $model_name = 'Model_'.$controller_name;
    $controller_name = 'Controller_'.$controller_name;
    $action_name = 'Action_'.$action_name;
 
    if(file_exists(F_PATCH.'/system/model/'.$model_name.'.php')){
      include F_PATCH.'/system/model/'.$model_name.'.php';
    }
    if(file_exists(F_PATCH.'/system/controller/'.$controller_name.'.php')){
      include F_PATCH.'/system/controller/'.$controller_name.'.php';
    }else{
      header("Location: /index");
    }
 
    if(method_exists($controller_name,$action_name)){
      $controller = new $controller_name();
      $controller->$action_name($action_parameters);
    }else{
      header("Location: /index");
    }
    Eventd::fire('activity');
    if(!empty($_SESSION['auth'])){
      Eventd::subscribe('activity', function(){
        include_once"connect_bd.php";
        $time_last_active = time();
        $insert_time_last_active = mysqli_query($link,"INSERT INTO recent_activity (user_id,user_ip,last_date_activity)
                                                              VALUES ('66','555','$time_last_active')
                                                              ")or die(mysqli_error($link));
      });
    }
    Eventd::handle();
 
 
 
  }
 
 
}
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
07.04.2016, 15:56
А если убрать из функции-подписчика Ваш код и сделать просто "echo", как отрабатывает? Т.е. вот так:
PHP
1
2
3
Event::subscribe('activity', function(){
    echo 'TEST';
});
Добавлено через 3 минуты
Кстати, в методе "handle" замените "return" на "continue", я не так написал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.04.2016, 15:56
Помогаю со студенческими работами здесь

Реализация CRUD MVC
Здравствуйте. Извиняюсь за глупый вопрос, может не правильно формулирую и вообще не о том думаю, но все же прошу направить в нужное...

Проверка авторизации на сайте, MVC
Доброго времени суток. Вопрос неоднократно поднимался, но я в php новичок, поэтому прошу совета. Имеется каркас MVC Есть родительские...

MVC- грамотная реализация модели
Здравствуйте! Осваиваю ООП+MVC, брал пример из http://habrahabr.ru/post/150267/ Хочу научиться вести порядок у себя в классах, по всем...

Реализация и создание DropDownList в MVC 4
Кто поможет мне сделать DropDownList для папок в MVC4, мне надо чтоб в дропе были видны все папки которые находятся в деректории...

Реализация структуры приложения mvc
Здравствуйте, проконсультируйте пожалуйста по нескольким вопросам, связанным со структурой реализации проекта. У меня есть БД и её модель...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru