2016-08-19 36 views
2

如何在symfony中優化API調用?在Symfony中優化API調用

我用Guzzle包打電話,但在某些情況下時間很長。

在客戶端應用程序中調用服務器的一個函數。 在服務器應用程序中從數據庫中提取對象併發送回客戶端。 在客戶端使用來自服務器響應的屬性創建新對象。

+0

也許與_caching_? – pavlovich

+0

如何?我只使用php和symfony一個月,我是初學者。 :D –

+1

這個想法是使用Symfony API緩存。有很多關於它的材料,例如http://stackoverflow.com/questions/12038462/how-to-properly-cache-my-symfony2-apis等等! ;) – pavlovich

回答

2

改進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調用來加快速度。但要小心,因爲緩存存在呈現陳舊(過時)數據的缺點。有些東西可以(也應該)被緩存,但有些東西不能。

+0

PHP的維護者Julien Pauli的推文應該不鼓勵使用HTTP的這種緩存機制:https://twitter.com/julienpauli/status/767633093138219008 –

+0

@KévinDunglas,請介紹該推文下的評論與聲明發生衝突)。選擇緩存方法純粹取決於開發人員的大小等任務的類型等。沒有_one和only_真正的方法。不要盲目追隨任何人所說的話(核心開發者,總統,教皇等),最好是自問自己爲什麼和什麼時候使用某種方法。 – pavlovich

+0

以安全的方式正確實施HTTP協議非常困難。設計一個高效的緩存系統,特別是優化內存佔用是很困難的,PHP並不是爲此設計的。 Doctrine Cache是​​一個很好的軟件,但它並沒有爲HTTP緩存設計或優化(它有很多其他用例)。 順便說一句,如果你真的想使用PHP進行HTTP緩存,你應該直接使用Symfony內置的HttpCache逆向代理。 您可能會對PHP中HTTP緩存的討論感興趣:https://github.com/symfony/symfony/issues/19705 –

1

如果你控制了服務器

你應該把緩存反向如Varnish代理你的PHP服務器上。 PHP應用程序必須發送HTTP緩存頭以告知代理它必須緩存請求的時間。或者,您可以使用像FOSHttpCache這樣的庫來設置緩存失效策略(當數據更新發生時,PHP服務器將從代理中清除緩存 - 這是更高級和複雜的場景)。 如果請求的資源位於反向代理緩存中,則甚至不會調用PHP服務器。

您還應該使用類似Blackfire.io或xhprof的探查器來查找爲什麼PHP代碼的某些部分(或您的SQL查詢)需要很多時間才能執行,然後進行優化。

如果你控制客戶端

您可以使用this HTTP cache middleware for Guzzle根據由API發送的HTTP報頭隱藏每個API的結果。