【问题标题】:whats the best way to play a playlist of audio in php on different pages at the same time and at once什么是同时在不同页面上同时播放 php 中音频播放列表的最佳方式
【发布时间】:2012-11-24 16:16:47
【问题描述】:

我正在做一个项目,其中我需要在服务器上创建 txt 文件时发布公告,并且我需要通过音频公告通知所有用户,音频应在任何客户端浏览器上立即播放目前在页面上。公告的播放需要同步到最大精度。

公告由多个音频文件(播放列表)组成。

在所有活动客户端播放公告后,txt 文件将被删除。并且服务器将等待/寻找另一个 txt 文件。

例如: client1 - 服务器时间:19:22:01,收到通知并播放音频 Client2 - 服务器时间:19:22:01,收到通知并播放音频

有什么建议吗?关于如何在所有客户上一次完成公告,有什么技巧吗? mysql 数据库或 Flash、Applet、HTML5 音频、JQuery 等

谢谢..

【问题讨论】:

  • 您可以使用长轮询器。它基本上是一个简单的轮询器,在有数据之前不会返回。让长轮询器(通常是 PHP)中的代码轮询数据库中的事件。在这种情况下,您可以在数据库上获得毫秒级的准确轮询,而无需创建大量数据流量,所有这些都使用现成的成熟技术。
  • 目前我正在使用类似的方法,但仍有近 1.5 秒的差异。我想减少。
  • 找出这 1.5 秒的来源。我们在数据库上创建了具有 1 分钟超时和 100 毫秒轮询器的长轮询器,它们在 100 毫秒内做出反应。 (另外:你真的需要亚秒级精度吗?也许你使用了错误的工具......)
  • 工具有html5、php、mysql和轮询技术。是的,亚秒级精度对我来说很重要。你使用/推荐什么工具。
  • 在我们的例子中,我们使用 PHP/MySQL 和基本的 Ajax。 MySQL 轮询器使用 PHP 的 usleep 在数据库轮询之间休眠 100 毫秒。我将代码放在答案中。

标签: php jquery mysql html flash


【解决方案1】:

我用简单的 PHP、Ajax 和 MySQL 编写了一个长轮询技术:

PHP代码如下:

timeout = 600;
while (timeout > 0) {
    $res = db_query("QUERY");
    $return_value = create_value_from_result($res);

    // see if the result changed
    $db_hash = md5($return_value);

    if ($_SESSION['hash'] == $db_hash) {
        // the result didn't change -- sleep and poll again
        // usleep take microseconds, 100000 is 100 millisecond
        // this is the default database polling interval
        usleep(100000);
        $timeout--;
    } else {
        // the result changed -- reply the result and set the session hash
        $timeout = 0;
        $_SESSION['hash'] = $db_hash;
    }
}
return json_encode($return_value);

而且 Javascript 是简单的 Ajax(dojo 就是这种情况):

function longpoll() {
    dojo.xhrPost({
        url: 'longpolling.php',
        load: function (data, ioArgs) {
            data = dojo.fromJson(data);

            do_magic(data);

            // use settimeout to avoid stack overflows
            // we could also use a while(1) loop,
            // but it might give browser errors such as 'script is
            // running too long' (not confirmed)
            setTimeout(longpoll, 0);
        }
    });
}

您需要 60 秒超时以确保浏览器不会在 Ajax 调用上超时。

这样,只要 QUERY 的结果发生变化(插入记录,对记录进行更新),PHP 调用就会返回,Ajax 就会得到它的结果。

【讨论】:

  • 只有一个问题.. 60 秒超时会产生问题。如果两个客户端正在运行怎么办?两者都将以多少精度显示更新的数据。我希望他们同步显示。
  • 如果有两个客户端正在运行,它们各自都有自己的 PHP 调用和自己的超时。他们几乎可以立即使用同步的数据。我们已经将这种技术用于多个客户端和大量数据点。超时只是为了确保浏览器不会给出“服务器响应时间过长”错误。试试看,你会发现它有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多