ホームページ >バックエンド開発 >PHPチュートリアル >アプリのAPI消費をスピードアップする方法
PHPアプリケーションAPI呼び出しの効率を改善するための
PHPアプリケーションを開発する場合、リモートリソースやサービスと対話する必要がある状況に遭遇する可能性があります。アプリケーションの機能を拡張するには、さまざまなAPIサービスを使用してリモートデータを取得したり、他のWebサイトのユーザーアカウントに接続したり、アプリケーションで共有しているリソースを変換したりできます。 ProgrambableWebのWebサイトは、現在10,000を超えるAPIがWebで利用可能であるため、PHPアプリケーションの機能を拡張するために多くのサービスを見つけることができることを指摘しています。ただし、APIを誤って使用すると、パフォーマンスの問題を迅速に引き起こし、スクリプトの実行時間を延長する可能性があります。これを避けたい場合は、この記事で説明したソリューションのいくつかを実装することを検討してください。
関数を提供します。 curl_multi
関数を使用すると、Curlライブラリを使用してPHPで典型的なリクエストを行うことに似ています。唯一の違いは、実行するリクエストのセットを準備する必要があること(1つだけでなく)、curl_multi
関数を使用してcurl_init
関数に渡す必要があることです。次に、呼び出しcurl_multi_add_handle
関数はリクエストを同時に実行し、curl_multi_exec
は各API呼び出しの結果を取得できるようにします。ロジックを実装するコード例を表示するには、こちらをご覧ください。 curl_multi_getcontent
関数を使用する場合、注意すべき重要なことがいくつかあります。まず、curl_multi
関数の実行時間は、curl_multi_exec
関数に渡されたリクエストセットで最も遅いAPI呼び出しが限られている限りです。したがって、各API呼び出しにかかった時間がほぼ同じである場合にのみcurl_multi_add_handle
を使用することは理にかなっています。 curl_multi
セットに他のセットよりも大幅に遅いリクエストがある場合、スクリプトは、最も遅いリクエストが完了するまで実行を継続できません。 curl_multi
また、一度に実行できる並列リクエストの数を決定する必要があることも重要です。あなたのウェブサイトが多くのトラフィックを処理し、各ユーザーがリモートサーバーへの同時API呼び出しをトリガーすると、一度に実行されたリクエストの総数がすぐに高くなる可能性があることを忘れないでください。 APIドキュメントに記載されている制限を確認し、これらの制限に到達したときにサービスがどのように応答するかを確認してください。制限に達すると、リモートサーバーは特定のHTTP応答コードまたはエラーメッセージを送信する場合があります。アプリケーションは、そのような状況を正しく処理するか、ログに入れて、問題を診断してリクエストの数を減らすことができるようにする必要があります。
メインアプリケーションプロセスから個別のAPI呼び出し
そのような問題からエンドユーザーを保護する場合は、要求をメインプロセスから別のスクリプトに処理する責任を負うアプリケーションの部分を分離する必要があります。つまり、API呼び出しは、サイトの表示を担当するコードの部分に干渉しない別のスレッドで実行されることを意味します。
このようなソリューションを実装するには、別のPHPスクリプトを書き込み、コマンドラインアプリケーションと同様に
関数を使用して実行できます。さまざまなPHPフレームワークは、多くの場合、書き込みコマンドラインスクリプトを簡素化し、既存のアプリケーションモデルまたはコンポーネントに簡単に統合できるモジュールを提供します。 Symfony2またはCakePhpコンソールコンポーネントを確認して、いくつかの例を確認してください。さまざまなPHPプラットフォーム(フレームワークだけでなく)は、WP CLI(WordPressのコマンドラインインターフェイス)など、ライティングコマンドラインスクリプトを簡単にするツールを提供する場合があります。
exec()
別のプロセスでAPI呼び出しを処理するためのより強力な方法を探している場合は、Gearmanなどのジョブサーバーのセットアップを検討してください。ジョブサーバーは、特定のタスク(ジョブ)を別のプロセスに分離するために必要なすべての操作を実行する完全なソリューションです。 Alireza Rahmani KhaliliがGearmanの記事を始めて、それがどのように機能し、PHPでどのように実装するかを学びましょう。 Zend Serverプラットフォームで作業する場合は、同様の機能を提供するZend Jobキューコンポーネントを使用できます。その機能と使用法の例は、Alex Stetsenkoによって書かれた記事「Zend Job Queueとのスケジューリング」で説明されています。
API呼び出しを分離するために選択したソリューションに関係なく、アプリケーションのさまざまな部分が互いにどのように通信するかを考慮する必要があります。まず、アプリケーションの部分全体(データベーステーブルやファイルなど)にアクセスできるAPI呼び出しから受信したデータを配置する必要があります。また、個々のスクリプト実行のステータスを共有する必要があります。メインアプリケーションは、外部で実行されたAPI呼び出しがずっと前に完了したかどうか、または失敗したかどうかを知る必要があります。ジョブサーバーソリューションの使用を検討している場合、ジョブステータスを監視する機能が提供される場合があります。ただし、単純なPHPコマンドラインスクリプトの作成に固執したい場合は、この種のロジックを自分で実装する必要があります。
複数のHTTP要求または複数のスレッド?
したがって、どのソリューションが優れていますか?curl_multi
関数を使用して複数のHTTP要求を一度に実行するか、API呼び出しをメインアプリケーションプロセスから分離しますか?リモートサーバーのクエリのコンテキストに依存します。リクエストのためだけでなく、API呼び出し全体がスクリプトを処理するのに長い時間がかかることがあります。また、特に変換されたファイルを処理したり、大量のデータベースを書き込んだりする場合、受信したデータの処理に責任がある大量のコードもあります。この場合、curl_multi
関数を使用するだけではアプリケーションをスピードアップするのに十分ではない場合があります。リモートホストから受信した操作と処理データ全体に責任のある個別のスレッドを実行すると、アプリケーションのパフォーマンスが向上する可能性があります。一方、あなたの側で重いデータ処理を伴わない多くの簡単なAPI呼び出しを実行する必要がある場合、curl_multi
関数に固執するだけでアプリケーションをより速くするのに十分かもしれません。
インテリジェントキャッシュエンジンを構築します
ワーキングキャッシュエンジンを作成して有効なデータを返すには、リモートサーバーの応答が変更されていないことを確認する必要があるため、毎回入手する必要はありません。これは特定のAPIサービスによって異なる場合がありますが、全体的なアイデアは、特定の期間に同じ応答を与える一連のパラメーター(リクエストで渡されている)を見つけることです。たとえば、リモートサービスから毎日の通貨為替レートを取得した場合、特定の通貨(これはパラメーター)の為替レートが1日変わらないままであることを判断できます。したがって、この特定のAPIから受信したデータを保存するために使用されるキャッシュキーには、通貨と日付の両方が含まれている必要があります。アプリケーションが次回この特定の為替レートを取得する必要がある場合は、キャッシュ(データベースやファイルなど)に保存されたデータを参照し、HTTPリクエストを避けることができます。
上記のシナリオでは、アプリケーションがリモートサービスで受け取ったデータをキャッシュできる状況をチェックするすべての責任を想定しているため、正しいキャッシュロジックを自分で実装する必要があります。ただし、APIサービスが共有データに変更され、特定のリソースにリンクされたメタデータを含む追加のフィールドを返す場合もあります。メタデータは、最後の変更された日付、改訂番号、またはリソースコンテンツに基づいて計算されたハッシュ値などの値で構成されている場合があります。この種のデータを使用することは、特に大量のデータを扱う場合、PHPアプリケーションのパフォーマンスを改善するための優れた方法です。 APIに接続するたびにリソース全体を取得する代わりに、タイムスタンプまたはハッシュ値を最後の受信値と比較するだけです。それらが等しい場合、リモートコンテンツが変更されていないため、以前に取得したデータを使用できることを意味します。このようなソリューションは、アプリケーションでキャッシュエンジンを使用していると仮定しますが、キャッシュに保存されているデータが有効かどうかを心配する必要はありません。 APIサービスによって返されるメタデータに依存しているため、リモートサーバーが提供するメタデータ値を比較するだけです。
リモートリソースメタデータを使用することは、ファイルホスティングサービスAPIを使用する場合に特に有益です。多くの場合、リモートフォルダーとファイルを処理することは、大量のデータを転送することを意味し、パフォーマンスの問題を引き起こす可能性があります。これを回避する方法の例を示すために、Dropbox APIで使用されているソリューションを説明しましょう。 Dropbox APIサービスは、リモートファイルが変更されたかどうかを確認するために適用される特定のデータを返します。まず、メタデータメソッド(名前、サイズ、またはパスなどのフォルダーとファイル情報を返す)には、返されたリソースのハッシュ値を表すハッシュフィールドが含まれています。新しい要求のパラメーターとして以前の要求からハッシュ値を提供し、リモートデータがリクエスト間で変更されていない場合、APIはHTTP 304(変更されていない)応答のみを返します。 Drobox APIは、特定のフォルダーまたはファイルの変更を通知するために特別に使用されるDeltaメソッドも提供します。 Hash値とDeltaメソッドは、アプリケーションのパフォーマンスを大幅に改善できるため、APIドキュメントで推奨されます。これは明らかなように聞こえるかもしれませんが、場合によっては、APIドキュメントを注意深く読むと、API呼び出しをより効率的にする方法に関する具体的なソリューションが得られる場合があります。上記のDropbox APIの使用は、非常に明確な例です。ただし、応答で送信されたデータの量を減らす他の方法がある場合があります(たとえば、データセット全体を受信するのではなく、APIによって返されるいくつかの特定のフィールドを選択します)。別のリクエストで実行したアクションを一度に実行できるかどうかを確認することもできます。たとえば、Google Translate APIの翻訳方法(異なる言語でテキスト翻訳を取得するために使用)は、1つのリクエストで複数の翻訳を返すことができます。 1つのAPI呼び出しで処理するためにテキスト文字列を渡すことにより、複数のリクエストを行うことを避けることができます。これにより、アプリケーションの実行時間を節約できます。
ご覧のとおり、リモートAPIの使用に大きく依存するPHPアプリケーションのパフォーマンスを改善する方法はたくさんあります。一度に複数のリクエストを実行することができます。curl_multi
関数を使用するか、別のアプリケーションスレッドを実行します。別のソリューションは、不必要なAPI呼び出しを行うことを妨げるキャッシュエンジンを実装したり、サーバー間で転送されるデータの量を減らすことです。最後に、APIサービスが提供するアプローチは、1つのリクエストで複数の操作を実行するなど、パフォーマンスを改善するためのいくつかのすぐに使用できるソリューションを提供できます。
この投稿が、APIリクエストを効果的に処理する方法についての洞察を提供することを願っています。記事で提起されたキーポイントや、APIの使用をスピードアップする方法に関する他のヒントについてコメントがある場合は、以下に投稿してください。 Google Plusを介して直接私に連絡することもできます。
加速アプリケーションおよびAPI使用に関するFAQパフォーマンスを向上させるためにAPIを最適化するにはどうすればよいですか?
APIを使用するとはどういう意味ですか?
アプリケーションのAPI使用量をスピードアップする方法はいくつかあります。まず、非同期コールを使用して、メインスレッドのブロックを防ぐことができます。次に、ページングを使用して、APIによって返されるデータの量を制限できます。第三に、キャッシュを使用して頻繁にアクセスされるデータを保存し、APIへのリクエストの数を減らすことができます。最後に、データ圧縮を使用して送信されたデータのサイズを縮小して、データの送信と受信にかかる時間を短縮できます。
コンテンツ配信ネットワーク(CDN)は、APIパフォーマンスの向上に重要な役割を果たします。さまざまな地理的位置にある複数のサーバーにコンテンツを配布することにより、ネットワークの遅延を削減します。クライアントがリクエストを送信すると、CDNはそれを最寄りのサーバーに向け、クライアントからサーバーにデータを返すのにかかる時間を短縮します。
キャッシュは、キャッシュに頻繁にアクセスされるデータを保存することにより、APIパフォーマンスを向上させます。クライアントがデータ要求を送信すると、サーバーは最初にキャッシュをチェックします。データがキャッシュにある場合、サーバーはすぐにそれを返し、サーバーの処理時間とロードを短縮します。データがキャッシュにない場合、サーバーはデータベースからそれを取得し、処理し、将来のリクエストのためにキャッシュに保存します。
データ圧縮により、送信されたデータサイズが縮小することによりAPIパフォーマンスが向上します。これにより、データの送信と受信にかかる時間が短縮され、APIの速度が向上します。データの圧縮は、大量のデータを処理する場合に特に有利です。
私のAPIのパフォーマンスを測定する方法は?
ユーザーエクスペリエンスに対するAPIパフォーマンスの影響は何ですか?
以上がアプリのAPI消費をスピードアップする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。