Показывать один и тот же контент одновременно в другом браузере - PullRequest
0 голосов
/ 04 июля 2018

Я занимаюсь разработкой игры с числами, в которой пользователи будут покупать цифры, а через 2 дня будут разыграны победители.

Я использую PHP для бэкэнда и jQuery для внешнего интерфейса.

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

Я подумал, может быть, я смогу построить эту игру с помощью PHP и Javascript, но это выглядит не так просто. Ребята, не могли бы вы предложить альтернативу? Как я могу улучшить этот код, чтобы он отображал один и тот же номер в другом браузере?

У меня есть идея, что невозможно генерировать случайное число для каждого запроса. Может быть, я могу сохранить номер в базе данных, а затем получить этот номер в PHP, чтобы номер был уникальным для каждого запроса.

Фактическая проблема заключается в создании одного и того же контента для каждого пользователя в разных браузерах. Любая помощь будет очень признательна.

Javascript:

var myTimer = setInterval(checkDrawDate, 1000);

function checkDrawDate() {
      var today = new Date();
      var date = today.getFullYear()+'-'+(today.getMonth()+1)+'-'+today.getDate();
      var time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
      var dateTime = date+' '+time;
      var x = new Date(dateTime);
      var y = new Date("{{$drawDate}}"); //this is laravel variable which contain drawdate e.g. 2017-07-05

      if(x >= y){
          drawNumber();
    }
}

function drawNumber(){
      $.get("{{ route('ajaxcomparepowerball') }}",{'gameId': gameid}, function(res){
       $('#mybets').html(res.html); 
     });
}

PHP:

public function ajaxDrawNumber(Request $req){
     return rand(0,49);
}

Ответы [ 4 ]

0 голосов
/ 12 июля 2018

Чтобы сохранить и сохранить состояние пользователей, можно использовать хранилище значений ключей, такое как Aerospike. Сохранять и извлекать данные в хранилище значений ключей очень просто. В приведенном выше случае нам просто нужно сгенерировать уникальный ключ, используя gameId, userId и date. И сохраните данные пользователя против уникального ключа.

Для начала работы с PHP-клиентом Aerospike: PHP-клиент Aerospike

Если данные присутствуют против уникального идентификатора для этого конкретного пользователя, просто верните его, в противном случае создайте новое случайное число, сохраните его против уникального ключа и верните его. Пожалуйста, будьте осторожны при создании уникального ключа. Вместо использования даты и времени на стороне сервера, пожалуйста, отправьте дату в запросе вызова ajax, чтобы не было проблем с часовым поясом. Это всегда будет часовой пояс пользователя, и не будет никаких проблем, если сервер находится в другом часовом поясе, а пользователь - в другом часовом поясе.

function drawNumber(){
  $.get("{{ route('ajaxcomparepowerball') }}",{'gameId': gameid,'date':user-timezone-date}, function(res){
   $('#mybets').html(res.html); 
 });
}

Здесь «user-timezone-date» должен быть фиксированный формат даты, например «MM-dd-yy», который будет обозначать тот же день. часы или секунды не должны учитываться при генерации уникального ключа, иначе во время получения состояния пользователя; генерация определенного уникального будет изменяться каждый час или каждую секунду, и вся цель этого действия будет разрушена.

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

0 голосов
/ 07 июля 2018

Вот несколько возможных решений.

  • Если вам нужны те же данные, измененные для пользователей в режиме реального времени, я думаю, что лучшим вариантом будет WebRTC , быстрый запуск здесь . И здесь простой пример отправки строк в реальном времени между клиентами. Если вам также нужен сервер взаимодействия с клиентом, вы можете использовать отправленные сервером события .
  • Вы можете выполнить двунаправленную связь между браузером и сервером, используя WebSockets . Вы можете отправлять и получать управляемые событиями ответы. Используя базу данных, вы можете общаться с двумя клиентами.
  • Самым простым является использование базы данных для хранения информации и выполнения ajax для отправки данных на сервер (и в базу данных), а также отправляемых сервером событий для отправки данных клиентам.

Пример основного отправленного сервером события :

Javacript:

    var evtSource = new EventSource("myserver.php");
    evtSource.onmessage = function(e) {
    // listening for new messages here   

   alert(e.data)//  e.data is mynumber

    } 

Php (myserver.php)

<?php    
header('Cache-Control: no-cache');
header("Content-Type: text/event-stream\n\n");       

while (1) {

  //perform a query in your database with your driver
  $result = mysql_query("SELECT mynumber FROM mytable WHERE user = 1");
  $row = mysql_fetch_assoc($result);

    echo $row['mynumber'];//<-- sending mynumber to client    

  ob_end_flush();
  flush();
  sleep(1);// <-- this is every second, but you could fire this with ajax or some other event.

}

Этот код отправляет номер с сервера клиенту , который прослушивает. Если пользователь внес изменение, одна из возможностей состоит в том, что клиент отправляет ajax для обновления какого-либо значения в базе данных . Таким образом, в то же время сервер ajax может отправить это как обновление клиентам, прослушивающим . Таким образом, весь процесс завершен.

0 голосов
/ 11 июля 2018

Я думаю, все, что вам нужно, это. Вызовите функцию через каждые, скажем, 5 секунд или меньше, получите данные с сервера и обновите их на странице.

window.setInterval(function(){
  updateNumber();
}, 5000);// set for every five seconds

 function updateNumber(){
//ajax code to fetch live data and append the data in the numbers container
}

И не забудьте перепроверить данные перед сохранением чисел на сервере.

Надеюсь, это поможет. !!!

0 голосов
/ 06 июля 2018

A Cron Job потребуется для реализации этой функции. Поскольку вы рисуете число в определенное время (после $drawDate в вашем случае). Таким образом, задание cron будет выполняться один раз в день, проверьте, является ли $drawDate для каждой игры сегодня или пройдено. Если условие истинно, $drawDate <= now, вызовите функцию для генерации случайного числа розыгрыша rand(0,49) и сохраните его в базе данных, соответствующей gameid совпадающих игр (имеющих $drawDate <= now).

В результате этого много работы с Javascript будет сокращено. В JS необходимо выполнить запрос ajax с помощью gameid, чтобы получить из базы данных запись с номером розыгрыша для конкретной игры. Если запись не найдена, это означает, что случайное число еще не нарисовано.

Я думаю, что вы используете Laravel, поэтому для планирования задач в laravel посетите здесь .

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