在Symfony中优化API调用

时间:2016-08-19 14:14:58

标签: api symfony guzzle

如何在symfony中优化API调用?

我用Guzzle捆绑打电话,但在某些情况下的时间很长。

在客户端应用程序中从服务器调用一个函数。 在服务器应用程序中从数据库中提取对象并发送回客户端。 在客户端中创建具有来自服务器响应的属性的新对象。

2 个答案:

答案 0 :(得分:1)

改善API调用的方法之一是使用缓存。在Symfony中,有许多不同的方法可以实现这一目标。我可以告诉你其中一个(PhpFileCache例子):

services.yml 中创建缓存服务:

your_app.cache_provider:
    class: Doctrine\Common\Cache\PhpFileCache
    arguments: ["%kernel.cache_dir%/path_to/your_cache_dir", ".your.cached_file_name.php"]

(请记住,您的应用需要Doctrine个分机才能工作)

然后将您的缓存服务your_app.cache_provider传递给您需要缓存的任何服务:

再次在您的 services.yml

some_service_of_yours:
    class: AppBundle\Services\YourService
    arguments: ['@your_app.cache_provider']

最后,在您的服务中(您要执行API缓存的地方):

use Doctrine\Common\Cache\CacheProvider;

class YourService
{
    private $cache;

    public function __construct(CacheProvider $cache)
    {
        $this->cache = $cache;
    }

    public function makeApiRequest()
    {
        $key = 'some_unique_identifier_of_your_cache_record';

        if(!$data = $this->cache->fetch($key))
        {
            $data = $provider->makeActualApiCallHere('http://some_url');
            $this->cache->save($key, serialize($data), 10800); //10800 here is amount of seconds to store your data in cache before its invalidated, change it to your needs
        }

        return $data; // now you can use the data
    } 
}

这是一个非常典型的例子,您应该根据您的确切需求进行更改,但想法很简单。您可以缓存数据并避免不必要的API调用以加快速度。但要小心,因为缓存存在呈现过时(过时)数据的缺点。有些事情可以(而且应该)被缓存,但有些事情却没有。

答案 1 :(得分:0)

如果您控制服务器

您应该在PHP服务器之上放置一个像Varnish这样的缓存反向代理。 PHP应用程序必须发送HTTP缓存标头,以告知代理必须缓存请求的时间。或者,您可以使用像FOSHttpCache这样的库来设置缓存失效策略(当数据更新发生时,PHP服务器将从代理中清除缓存 - 这是一个更高级和更复杂的方案)。 如果请求的资源位于反向代理缓存中,则甚至不会调用PHP服务器。

您还应该使用Blackfire.io或xhprof等分析器来查找为什么PHP代码的某些部分(或您的SQL查询)需要花费很多时间才能执行,然后进行优化。

如果您控制客户

您可以使用this HTTP cache middleware for Guzzle根据API发送的HTTP标头缓存每个API结果。