Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从大型播放列表中发送随机歌曲的客户端数据?_Php_Algorithm_Node.js - Fatal编程技术网

Php 如何从大型播放列表中发送随机歌曲的客户端数据?

Php 如何从大型播放列表中发送随机歌曲的客户端数据?,php,algorithm,node.js,Php,Algorithm,Node.js,我创建了一个API,用于返回服务器上歌曲的数据,包括流URL。当客户端调用API时,它将获取数据,并开始在播放器中播放歌曲 但是现在我有多个客户端调用API,返回播放列表中最近没有听到的歌曲的随机数据的最佳方法是什么?有几千首歌,还在不断扩展 因此,我的问题是以下方法是否是一个好方法: 以下是我打算做的事情。为每个客户机设置会话,在初始请求时,我获取所有歌曲,生成一个随机列表,将其与会话ID一起保存在缓存中,然后在每个后续请求时,检查会话ID,并获取并返回下一首歌曲数据 为了确保不播放最近播放的

我创建了一个API,用于返回服务器上歌曲的数据,包括流URL。当客户端调用API时,它将获取数据,并开始在播放器中播放歌曲

但是现在我有多个客户端调用API,返回播放列表中最近没有听到的歌曲的随机数据的最佳方法是什么?有几千首歌,还在不断扩展

因此,我的问题是以下方法是否是一个好方法:

以下是我打算做的事情。为每个客户机设置会话,在初始请求时,我获取所有歌曲,生成一个随机列表,将其与会话ID一起保存在缓存中,然后在每个后续请求时,检查会话ID,并获取并返回下一首歌曲数据

为了确保不播放最近播放的歌曲,我将在数据库中记录以前听过的50首歌曲的历史记录,并进行歌曲ID比较,如果匹配,则获取下一首歌曲


这是一种有效的方法吗?

编辑:获得了服务器的更多信息

在用户的收听历史记录中存储X数量的歌曲(缓冲区,大小X)。实现一个请求随机歌曲的单一功能。当客户端需要新的随机歌曲时:

  • 从数据库中随机挑选一首歌曲
  • 将歌曲ID推送到收听历史缓冲区
  • 将数据返回到客户端
  • 如果您打算在服务器上存储用户数据,实际上不需要维护随机生成的歌曲列表


    否则,你就差不多说到点子上了。使用会话来识别用户。

    假设您使用的是mysql之类的数据库,或者任何与歌曲相关联的数据库,您可以生成一个随机数,并使用它从数据库中选择一首随机歌曲。任何基于ID的数据存储都可以实现这一点,并且可以非常好地扩展

    如果您知道您的最高歌曲ID是X,则生成一个介于1和X之间的随机数,称之为Y。执行如下查询:

    SELECT * FROM songs WHERE song_id>=Y LIMIT 1
    

    这将允许在您的身份证的差距,将真的很快。你可以把播放的歌曲记录在另一张桌子上,然后过滤掉。如果查询未返回任何结果,则反转随机数,如Y=X-Y,然后再次运行查询。

    可以使用JavaScript Ajax获取歌曲数据吗?是的,但调用API的方法不是问题,而是如何在后端随机化歌曲列表,以便在API响应中发送随机歌曲。如果我的问题不清楚,很抱歉。如果我的答案是你想要的,请告诉我。还请编辑您的问题以改进它。我的确切问题不是我之前的评论。确切的问题是,使用会话并在缓存中为每个客户端存储随机播放列表,然后从该缓存(会话存储)提供服务是否是一种好方法。不是关于如何创建随机播放列表的实际代码。我重新措辞了我问题的一些部分,让它更清楚一点;我改变了我的答案,我也在想这个问题,但限制是我会为一个用户随机选择数千首歌曲。我不认为给每个客户列出一千首随机歌曲的列表是件好事。当然,这取决于用户,但是:我会一次只选一首歌。每次给客户一首歌。当客户机请求一首新的随机歌曲时,您可以查看HTTP请求中先前侦听的歌曲ID。尽管根据用户已经听过的歌曲数量,为用户获取新歌的速度会变慢。如果您希望随机化工作正常,您基本上会在服务器端保存用户帐户。这个解决方案也是可行的,但正如我所说的,它取决于您的API用户。我应该指定侦听历史记录和活动将存储在服务器端。而历史上要比较过的将是50首左右的歌曲,数量不多。也就是说,你认为我应该如何修改我的想法?好的。在这种情况下:只需在用户的收听历史记录中存储X(50是可以的)数量的歌曲。我会返回每个客户端请求只有一首歌曲。返回时,将歌曲添加到用户的收听历史记录中(并从历史记录中删除最早的条目,使列表大小保持在X)。您只需维护一个列表,即服务器上用户的侦听历史记录。客户端也更容易实现,无需列表管理。