Php guzzle中的多个请求

Php guzzle中的多个请求,php,asynchronous,spotify,guzzle,Php,Asynchronous,Spotify,Guzzle,我的问题是: Spotify不会返回用户保存的所有曲目。返回轨道的计数是有限制的-这里是50 我找到了一个解决方案,可以返回所有用户保存的曲目。在我的例子中,它发出了很多请求,大约17次-814条曲目,但我的页面加载时间从6秒到8秒不等 我读过,但我不知道如何在我的情况下使用这个和异步请求,因为在我的情况下,没有已知数量的请求。仅当返回的TrackSitem的计数为0时,循环才会结束。你能帮我解决我的问题吗 <?php namespace AppBundle\Service; use

我的问题是: Spotify不会返回用户保存的所有曲目。返回轨道的计数是有限制的-这里是50

我找到了一个解决方案,可以返回所有用户保存的曲目。在我的例子中,它发出了很多请求,大约17次-814条曲目,但我的页面加载时间从6秒到8秒不等

我读过,但我不知道如何在我的情况下使用这个和异步请求,因为在我的情况下,没有已知数量的请求。仅当返回的TrackSitem的计数为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;
    }
}

不要依赖那个条件。要么依赖下一个条目不为空,要么计算您拥有的条目总数,并将其与总条目进行比较

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

您必须对进一步的请求使用asyncRequest,这将返回一个承诺,并计划所有剩余的请求。然后,您可以使用wait实例方法按顺序等待承诺。等待调用的顺序并不重要,因为等待将勾选内部事件循环,并对任何请求进行处理。所有进一步的等待呼叫都会缩短运行时间,甚至会立即解决

不幸的是,您必须手动构造URL,而不能依赖URL的下一个条目


我建议增加一些并发限制,Spotify可能对此有一些指导原则。Guzzle为此提供了一个池实现。

作为一种解决方案,您可以使用afaik,Spotify似乎没有任何终点来公开跟踪计数一个初始请求可能限制为一条记录?这将返回json中的总计数。由此,您可以根据总请求数和显示所有请求所需的页面数计算出所需的请求数。