如何在symfony中優化API調用?在Symfony中優化API調用
我用Guzzle包打電話,但在某些情況下時間很長。
在客戶端應用程序中調用服務器的一個函數。 在服務器應用程序中從數據庫中提取對象併發送回客戶端。 在客戶端使用來自服務器響應的屬性創建新對象。
如何在symfony中優化API調用?在Symfony中優化API調用
我用Guzzle包打電話,但在某些情況下時間很長。
在客戶端應用程序中調用服務器的一個函數。 在服務器應用程序中從數據庫中提取對象併發送回客戶端。 在客戶端使用來自服務器響應的屬性創建新對象。
改進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的維護者Julien Pauli的推文應該不鼓勵使用HTTP的這種緩存機制:https://twitter.com/julienpauli/status/767633093138219008 –
@KévinDunglas,請介紹該推文下的評論與聲明發生衝突)。選擇緩存方法純粹取決於開發人員的大小等任務的類型等。沒有_one和only_真正的方法。不要盲目追隨任何人所說的話(核心開發者,總統,教皇等),最好是自問自己爲什麼和什麼時候使用某種方法。 – pavlovich
以安全的方式正確實施HTTP協議非常困難。設計一個高效的緩存系統,特別是優化內存佔用是很困難的,PHP並不是爲此設計的。 Doctrine Cache是一個很好的軟件,但它並沒有爲HTTP緩存設計或優化(它有很多其他用例)。 順便說一句,如果你真的想使用PHP進行HTTP緩存,你應該直接使用Symfony內置的HttpCache逆向代理。 您可能會對PHP中HTTP緩存的討論感興趣:https://github.com/symfony/symfony/issues/19705 –
如果你控制了服務器
你應該把緩存反向如Varnish代理你的PHP服務器上。 PHP應用程序必須發送HTTP緩存頭以告知代理它必須緩存請求的時間。或者,您可以使用像FOSHttpCache這樣的庫來設置緩存失效策略(當數據更新發生時,PHP服務器將從代理中清除緩存 - 這是更高級和複雜的場景)。 如果請求的資源位於反向代理緩存中,則甚至不會調用PHP服務器。
您還應該使用類似Blackfire.io或xhprof的探查器來查找爲什麼PHP代碼的某些部分(或您的SQL查詢)需要很多時間才能執行,然後進行優化。
如果你控制客戶端
您可以使用this HTTP cache middleware for Guzzle根據由API發送的HTTP報頭隱藏每個API的結果。
也許與_caching_? – pavlovich
如何?我只使用php和symfony一個月,我是初學者。 :D –
這個想法是使用Symfony API緩存。有很多關於它的材料,例如http://stackoverflow.com/questions/12038462/how-to-properly-cache-my-symfony2-apis等等! ;) – pavlovich