优化 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 结果。
如何优化 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 结果。