如何在symfony中优化API调用?
我用Guzzle捆绑打电话,但在某些情况下的时间很长。
在客户端应用程序中从服务器调用一个函数。 在服务器应用程序中从数据库中提取对象并发送回客户端。 在客户端中创建具有来自服务器响应的属性的新对象。
答案 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结果。