优化 API 在 Symfony 中的调用

Optimize API call in Symfony

如何优化 symfony 中的 API 调用?

我用Guzzle bundle调用,但是有些情况下时间很长。

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

改进 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 调用以加快速度。但是要小心,因为缓存有呈现陈旧(过时)数据的缺点。有些东西可以(也应该)被缓存,但有些东西不能。

如果你控制服务器

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

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

如果控制客户端

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