Обновить страницу для всех подключенных пользователей после нажатия кнопки - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь обновить sh указанную страницу для всех подключенных пользователей, когда один из них нажимает кнопку, это возможно? Я развиваюсь в html, js и php.

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Вы можете использовать метод JavaScript, называемый redirect (), когда пользователь нажимает кнопку, этот метод перенаправляет на конкретный маршрут, который вы упомянули в своем методе перенаправления

0 голосов
/ 23 апреля 2020

Вы должны другим пользователям знать, когда один из них нажал кнопку.

Как заметил @balzacLeGeek, это работа для веб-сокетов. Но вы можете сделать это и в AJAX, используя приостановленный вызов AJAX, примерно так:

var refresher = function() {
    // CLIENT timestamp - beware of server time zones!
    const since = Date.now() / 1000;
    $.post('check-status.php', { since: since }).then(reply => {
        if (reply.pressed) {
            // do_reload();
        } else {
            // display some small animation to let user know we checked
        }
        // Schedule another round.
        window.setTimeout(refresher, 10);
    });
};

На странице, когда она загружена, просто вызовите refresher (), и она будет Начните, ну, в общем, проверку refre sh.

Функция проверки состояния вызывается постоянно, что приведет к недопустимой нагрузке на систему. Но поскольку ожидает возврата сервера, мы можем реализовать его следующим образом:

<?php
    $reply = [ 'status' => 'success', 'pressed' => false ];

    for ($sec = 0; $sec < 60; $sec++) {
       // ... check whether anyone pressed the button ...
       if (file_exists('pressed.json')) {
           if (filemtime('pressed.json') > $_POST['since']) {
               // return immediately.
               $reply['data']    = file_get_contents('pressed.json');
               $reply['pressed'] = true;
               break;
           }
       }
       sleep(1);
    }
    header("Content-Type: application/json;charset=UTF-8");
    die(json_encode($reply);

Вызов приостановлен на срок до 60 секунд или до тех пор, пока нажимает кнопку; в этом случае в течение одной секунды возвращаются все приостановленные вызовы и перезагружается экран всех пользователей; и они немедленно отправляют еще один вызов, который будет ожидать следующего нажатия и т. д.

Возможно, вы захотите поиграть со временем приостановки или реализовать сторожевой таймер setInterval, который гарантирует, что вызовы переподготовки будут выполнены правильно (если один вызов завершается неудачно, весь цикл останавливается для этого клиента, клиент «мёртв», поэтому при refre sh вы устанавливаете глобальную переменную метки времени, а функция наблюдения setInterval проверяет, что метка времени никогда не старше времени приостановки плюс допустимый запас, скажем, 2 секунды. Если это так, сторожевой таймер просто вызывает refresher () для перезапуска цикла и, возможно, отображает краткую анимацию «У вашего Inte rnet соединения возникла проблема»).

Нажатие Функция просто создает текстовый файл в ответ на нажатие кнопки. Или вы можете использовать базу данных, или область общей памяти, или Redis, или что-то еще:

$('#button').on('click', ()=> {
    $.post('/clicked.php',
      {
          user: 'lserni', // or read from a global application object
          message: $('#message').val()
      }
});

Сценарий вызывается, и для случая файла у вас есть условие гонки (что, если два человека нажмут оба кнопка в то же время?):

<?php
    file_put_contents(
        'pressed.json',
        json_encode([
            'message' => $_POST['message'],
            'user'    => $_POST['user'],
            'date'    => date('d/m/Y H:i:s'),
        ]
    );
    header('Content-Type: application/json; charset=UTF-8');
    die(json_encode([ 'status' => 'success' ]));

В случае файла, было недостаточно проверить наличие файла, потому что после первого щелчка файл всегда существует, и если десять клиентов проверьте, что первый не может просто удалить файл (остальные девять ничего не найдут и предположат, что никто не нажал кнопку).

Итак, каждый клиент записывает последний раз, когда запускал проверку кнопки, и сервер отвечает, файл для печати был создан позже, чем запрошенное время . Это тоже не идеально (последний раз не сохраняется, но считывается с часов, поэтому есть небольшое временное окно, когда печать не будет обнаружена; время клиента может отличаться от времени сервера), но оно должно быть достаточно для начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...