【问题标题】:Manage with limit and offset in php在 php 中使用限制和偏移进行管理
【发布时间】:2015-06-05 07:42:02
【问题描述】:

我目前正在开发一个 Web 应用程序,该应用程序将查找艺术家及其合作伙伴的头衔。为此,我决定通过this package(文档为here)解析API MusicBrainz。

假设我已经有了艺术家 mbid(MusicBrainz 的唯一标识符)。

问题是,例如,如果我在 David Guetta (mbid = 302bd7b9-d012-4360-897a-93b00c855680) 上进行搜索,脚本会告诉我发布的数量是 196。但是,API 为每个请求提供最多 100 个结果。

// Instantiate a MusicBrainz object
$brainz = new MusicBrainz(new GuzzleHttpAdapter(new Client()));
$brainz->setUserAgent('ApplicationName', '0.2', 'http://example.com');

$limit = 100;
$offset = 0;

$includes = array('labels', 'recordings');
try {
  $details = $brainz->browseRelease('artist', '302bd7b9-d012-4360-897a-93b00c855680', $includes, $limit, $offset);
  print_r($details);
} catch (Exception $e) {
  print $e->getMessage();
}

下面的函数browseRelease允许我们定义limitoffset等参数。

public function browseRelease($entity, $mbid, $includes = array(), $limit = 25, $offset = null, $releaseType = array(), $releaseStatus = array())
{
  if (!in_array($entity, array('artist', 'label', 'recording', 'release-group'))) {
    throw new Exception('Invalid browse entity for release');
  }
  return $this->browse(
    new Filters\ReleaseFilter(array()),
      $entity,
      $mbid,
      $includes,
      $limit,
      $offset,
      $releaseType,
      $releaseStatus
  );
}

现在我们来看看这篇文章中我真正的问题。

如果我为第一个查询定义了$limit = 100$offset = 0,我不明白如何根据总发布的数量更改这些值,从而得到介于 100 和 196 之间的结果(在此示例)。

【问题讨论】:

  • 我不懂 php 但你不要在第一个查询中设置 $offset=100 来获取下一组记录
  • 说你有 150 个结果。首先打电话给你:$offset = 0。然后你再次拨打$offset = 100。限制无关紧要:如果限制是 100,但只有 50 个结果可用,它会给你 50 个结果,从偏移值开始。
  • 也许将他的答案标记为已接受?当有人帮助您解决问题时,这就是在 SO 上说“谢谢”的方式。

标签: php limit offset musicbrainz


【解决方案1】:

截至this question,我会将我的答案作为“真实答案”发布:

伪语言

给定:150 个结果。 您可以定义:偏移量和限制。 但是:最大限制是 100 个结果。

您需要 2 次调用,因为一次只能获得 100 个结果。你可以这样解决它:

呼叫 1:

Offset: 0
Limit: 100
//Returns results 0 to 99.

呼叫 2:

Offset: 100
Limit: [OPTIONAL] 100
//Returns resuls 100 to 199. As there are only 150 results in total, it will automatically return 100 to 150

现在,我们也可以通过循环自动完成:

limit = 100
for (var i = 0; i < maxResults; i=i+100)
{
    offset = i
    GetResults(offset,limit);
}

【讨论】:

  • 不明白为什么它返回一个大小 = 25 的数组,然后返回一个大小 = 96 的数组......有什么问题? (默认限制值 = 25,但为什么要这样做?)
【解决方案2】:

Jordumus 的伪代码答案是正确的,但这是您必须修改代码以使其工作的方式。

$limit = 100;
$offset = 0;
$release_count = 0;

$includes = array('labels', 'recordings');
do {
  if ($offset != 0) sleep(1);
  try {
    $details = $brainz->browseRelease('artist', '302bd7b9-d012-4360-897a-93b00c855680', $includes, $limit, $offset);
    $release_count = $details['release-count'];
    print_r($details);
  } catch (Exception $e) {
    print $e->getMessage();
  }
  $offset += $limit;
} while ($offset < $release_count);

请注意,第一次设置$release_count 就足够了,因为该值不会改变,但重置它也没有什么坏处。

我在那里添加了一个sleep,因为所需的rate limiting 似乎没有在PHP 库中实现。

【讨论】:

  • 哇,这工作!!!!我已经编辑了你的帖子,因为 print_r 返回了错误 502 bad gateway。我已经把 var_dump 代替了。非常感谢!
  • 502 与 print_r/var_dump 无关,因为在 browseRelease() 上会引发 502 错误/异常。 musicbrainz 服务器时常出现此类问题。因此,当出现此类错误时,您应该有一些(手动或自动)“重试”机制。
  • 确实,经过几次测试,我看到mb服务器没有工作,然后它没有任何改变就可以工作。是的。我将放置例外以查看哪个请求不起作用。谢谢!
猜你喜欢
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2022-08-19
相关资源
最近更新 更多