2016-08-19 3 views
2

symfonyでAPI呼び出しを最適化する方法は?symfonyでAPI呼び出しを最適化する

私はGuzzleバンドルを呼び出しますが、状況によっては時間が非常に長くなります。

クライアントアプリケーションでは、サーバーから関数を呼び出します。 サーバーアプリケーションでは、データベースからオブジェクトを抽出し、クライアントに送り返します。 クライアントでは、サーバレスポンスのプロパティを持つ新しいオブジェクトを作成します。

+0

多分_キャッシング_? – pavlovich

+0

どのように?私はちょうど1ヶ月間、phpとsymfonyで作業しています。私は初心者です。 :D –

+1

Symfony APIキャッシングを使用することです。例えば、http://stackoverflow.com/questions/12038462/how-to-properly-cache-my-symfony2-apisなど多くの資料があります。 ;) – pavlovich

答えて

2

API呼び出しを改善する方法の1つは、キャッシュを使用することです。 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と_真の方法はありません。誰かが言うことを盲目的に追いかけるのではなく(コア開発者、大統領、教皇など)、WHYやWHENが特定のアプローチをとることを自分自身に問いかける方がよい。 – pavlovich

+0

HTTPプロトコルは正しく実装されており、安全に保護されています。効率的なキャッシュシステムを設計する、特にメモリ占有を最適化することは難しく、PHPはそのために設計されていません。 Doctrine Cacheは優れたソフトウェアですが、HTTPキャッシング用に設計されておらず、最適化されていません(他にも良い使用例がたくさんあります)。 ところで、実際にHTTPキャッシングにPHPを使用する場合は、Symfonyの組み込みHttpCacheリバースプロキシを直接使用する必要があります。 PHPのHTTPキャッシュに関するこのディスカッションに興味があるかもしれません:https://github.com/symfony/symfony/issues/19705 –

1

サーバーに

をコントロールしている場合あなたのPHPサーバーの上にワニスのようなキャッシュリバースプロキシを置く必要があります。 PHPアプリケーションは、リクエストをキャッシュする必要がある時間をプロキシに伝えるために、HTTPキャッシュヘッダーを送信する必要があります。また、FOSHttpCacheのようなライブラリを使用してキャッシュ無効化戦略を設定することもできます(PHPサーバーは、データの更新が発生したときにプロキシからキャッシュを削除します。 要求されたリソースがリバースプロキシキャッシュにある場合、PHPサーバーは呼び出されません。

また、Blackfire.ioやxhprofのようなプロファイラを使用して、PHPコード(またはSQLクエリ)の一部が実行され、最適化されるまでに何時間かかるかを確認する必要があります。あなたがクライアントに

をコントロールしている場合

あなたは、APIによって送信されるHTTPヘッダに応じて、すべてのAPIの結果をキャッシュするthis HTTP cache middleware for Guzzleを使用することができます。

関連する問題