guzzle多次请求

时间:2017-10-12 19:47:10

标签: php asynchronous spotify guzzle

这是我的问题:
Spotify不会返回所有用户保存的曲目。返回曲目的数量有限制 - 50(这里是API)。

我找到了一个返回所有用户保存曲目的解决方案(使用循环播放)。它提出了很多请求(在我的情况下是~17次 - 814首曲目)但是我的页面从6秒加载到8秒。

我读到了Concurrent requests,但我不知道在我的情况下如何使用这个和异步请求,因为在我的情况下,没有已知数量的请求。只有当返回的曲目(项目)的数量为0时,循环才会结束。你能解决我的问题吗?

<?php

namespace AppBundle\Service;

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use HWI\Bundle\OAuthBundle\Security\Core\Authentication\Token\OAuthToken;
use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

class SpotifyRequester
{
    protected $client;

    protected $tokenStorage;

    public function __construct(TokenStorageInterface $tokenStorage)
    {
        $this->tokenStorage = $tokenStorage;
        $this->client = new Client();
    }

    public function getSavedTracks()
    {
        $token = $this->getToken(); // true token

        $offset = 0;
        do {
            $response = $this->client->request('GET',
                'https://api.spotify.com/v1/me/tracks?limit=50&offset=' . $offset, [
                    'headers' => [
                        'Authorization:' => 'Bearer ' . $token,
                        'Accept:' => 'application/json',
                        'Content-Type:' => 'application/json',
                    ]
                ]);
            // Response from current request
            $content = json_decode($response->getBody()->getContents(), true);
            $offset += count($content['items']);
        }
        while (count($content['items']) != 0);
        // Count of tracks
        return $offset;
    }
}

1 个答案:

答案 0 :(得分:1)

不要依赖这种情况。要么依赖next条目不是null,要么计算您拥有的条目总数,并将其与total条目进行比较。

Spotify在响应周围的分页包装中公开total个条目。您可以使用前50个条目发出第一个请求,然后对所有剩余的块进行并发请求,因为您知道该点的总数。

您必须使用asyncRequest()作为进一步的请求,这将返回一个承诺,并安排所有剩余的请求。然后,您可以使用wait()实例方法按顺序等待promise。 wait()来电的顺序并不重要,因为wait()会勾选内部事件循环并为您的任何请求取得进展。所有进一步的wait()次呼叫都可以缩短运行时间,甚至可以立即解决。

不幸的是,您必须手动构建网址,而不是依赖于网址的next条目。

我建议添加一些并发限制,Spotify可能有一些指导方针。 Guzzle为此提供Pool实现。