ホームページ >バックエンド開発 >PHPチュートリアル >PHP の最適化について簡単に説明します
PHP の最適化について簡単に説明しましょう
プログラムを作成するとき、私たちは常に、プログラムの使用リソースを最小限に抑え、より高速に実行し、より少ないコードを作成したいと考えます。これらを追求している間に、私たちは多くのものを失うことがよくあります。次に、PHP の最適化についての私の理解を話したいと思います。最適化の目的は、最速の実行速度と最も簡単なコードの保守と引き換えに、最小限のコストを費やすことです。
特定のプログラム コードをいじるのではなく、大規模な最適化を実行します
ここで話している最適化は、基本的にサーバー、Apache、データベースなどからのものです。最適化は、プログラムの実行速度を向上させるために PHP コードを改善するのではなく、側面に基づいています。これは、プログラムの速度を向上させるためにプログラム内の正規表現を文字列処理関数に最適化するのと比較して、最適化が実行されるためです。大規模な最適化のコストはこれよりはるかに小さくなりますが、その見返りははるかに豊富です。
非コード領域の最適化には次の利点があります。
1. 通常、効率を大幅に向上できます
2. 危険にさらさないコードの整合性
3. 迅速な展開能力
キャッシュテクノロジー
以下で説明します一般的に使用されるキャッシュ テクノロジは、これらのキャッシュ テクノロジによって効率を大幅に向上させることができます。
キャッシュ テクノロジについて話すとき、Memcached について言及する必要があります。Memcached は、主に WEB 動的アプリケーションの高速化に使用されます。 。
Memcached の原理
Memcached は 1 つ以上のサーバーでデーモンとして実行され、クライアントからの接続操作の受信を待機します。クライアントはさまざまな言語で記述できます (例: PHP)。 PHP などのクライアントが memcached サービスとの接続を確立したら、次にアクセスするオブジェクトには一意の識別子キーがあり、アクセス操作は memcached に保存されます。 、キャッシュ ファイルに保存されないため、memcached は非常に効率的かつ高速になります。
memcached について説明した後、一般的に使用される キャッシュ方法について説明します。
1. コンパイルと OPCODE キャッシュ
PHP インタープリタ型言語であるため、実行時に各 PHP ファイルをコンパイルして実行する必要があります。同じファイルに異なるユーザーがアクセスする場合、または同じユーザーが異なる時間に同じファイルにアクセスする場合は、再コンパイルして実行する必要があります。毎回、かなりの時間がかかります。
コンパイルとキャッシュにより、各ファイルは変更後に 1 回だけコンパイルされるため、ユーザーがアクセスした後、機械語命令はハードディスクから読み取られるのではなく、メモリから直接フェッチされて実行されます。 。
最も一般的な PHP コンパイル キャッシュ ツールは、APC、Accelerator、xcache
、2. グローバル ページ キャッシュ – Squid Cache
Squid) です。人気のフリー ソフトウェア (GNU General Public License) プロキシ サーバーと Web キャッシュ サーバーは、Web サーバーのフロントエンド キャッシュ サーバーとして機能し、関連するリクエストをキャッシュすることで Web サーバーの速度を向上させます。
3. SQL キャッシュのローカル キャッシュ
ほとんどのアプリケーションでは、主なボトルネックは多くの場合データベースの操作に遡ります。これは通常、データベースが複雑であることが原因です。クエリには多くの時間がかかりますが、SQL キャッシュにより、複雑なクエリによって生じる負荷を大幅に軽減できます。
SQL キャッシュの例 (memcached 拡張機能を使用)
コード スニペット:
$key = md5("some sort of SQL query");
if (!($result = memcache_get($key))) {
$result = $pdo->query($qry)->fetchAll();
// キャッシュクエリ1 時間の結果
memcache_set($key, $result, NULL, 3600);
}
4. ローカル キャッシュ コード ブロック キャッシュ
PHP プログラムを最適化するために、実行時間を少し短縮するために各コード セグメントを最適化する必要がある場合がありますが、さまざまな複雑な PHP コード セグメントを最適化する代わりに、キャッシュを通じてそれらを直接無視する方が良いです。これらのコードセグメントの最適化は次のとおりです。
1. 効果をすぐに確認できます
2. 以前のコードは破壊されません
3. コードを最適化するよりもはるかに高速
コード ブロック キャッシュの例 (memcached 拡張機能も使用)
コード スニペット:
Function complex_function_abc($a, $b, $c) {
$key = __FUNCTION__ .serialize
(func_get_args());
if (!($result = memcache_get($key))) {
$result = //ファンクションコード
//1時間の実行結果を保存
memcache_set($key, $result, NULL , 3600);
}
return $result;
}
もちろん上記のメソッド以外にも、ファイル キャッシュ (データベースからデータを取得してファイルに保存する) を使用すると、静的 HTML ファイルなどを生成することもできます。ただし、これらのメソッドのキャッシュでも、ファイルはメモリではなくハード ディスクに保存されます。
出力制御
上記のキャッシュ技術に加えて、出力制御を使用してプログラムの実行時間を短縮することもできます
PHP と APACHE による出力について話しましょうコントロール
1. PHP 出力コントロール
ここでは主に PHP の ob_start() と OB シリーズの関数を使用します。これらの関数は何ができるのでしょうか?
1 つ目は静的テンプレート技術です。いわゆる静的テンプレート技術は、特定のメソッドを使用して、ユーザーがクライアント側の PHP によって生成された HTML ページを取得できるようにします。この HTML ページが更新されなくなると、別のユーザーがこのページを再度閲覧したときに、sina、163、sohu などの大量の情報を含む一部の Web サイトでは、プログラムが PHP および関連データベースを呼び出すことはなくなります。このようなテクノロジーの恩恵は非常に大きいです。
コード例:
ob_start(); //バッファを開く
?>
php すべてページの出力
$content = ob_get_contents() //PHP ページのすべてのコンテンツを取得します。output
$fp = fopen(” Output.html", "w"); //ファイルを作成して開き、書き込みの準備をします。
fwrite($fp, $content); //php ページのすべてのコンテンツを出力します。 html、そして……
fclose($fp);
?>
もちろん、この ob シリーズ関数には他にも多くの用途がありますが、説明は省略します。ここで一つずつ。
2. Apache 出力制御
SendBufferSize をページ サイズに設定すると、ページが一度に送信バッファーに配置され、処理速度が向上します。
SendBufferSize コマンド
説明: TCP 送信バッファ サイズ (バイト)
構文: SendBufferSize バイト
デフォルト値: SendBufferSize 0
スコープ:server config
ステータス:MPM
モジュール:beos、mpm_netware、mpm_winnt、mpmt_os2、prefork、worker
このコマンドは、サーバーの TCP 送信バッファ サイズ (バイト) を設定します。 。この値を増やすと、高速化と遅延 (約 100ms) という 2 つの影響が生じます。 「0」に設定すると、オペレーティング システムのデフォルトが使用されます。
ソース コードを通じて Apache/PHP/データベースをコンパイルすると、プログラムの速度が 10 ~ 15% 向上します
次に、コードを最適化するときに注意すべき点について説明します
1. 短いコードは速いコードと同じではありません
プログラムを書くとき、多くの人はできるだけ簡潔にコードを書きたいと考えますが、コードが短いほど、より多くのコードが必要になることがあります。実行時間が長いため、より多くのコードを使用する場合でも、遅いコードは使用しないでください
2. プログラムを作成するときは、追求するのではなく、プログラムのスケーラビリティにもっと注意を払う必要があります。速度
3. コードを最適化する前に、まずデータベース関連の部分を確認します。ほとんどのアプリケーションのボトルネックはコードではなくデータベースであるためです
4. マイクロ最適化にはメリットがありません
マイクロ最適化とは何ですか? 前述したように、コードの正規表現部分を文字列関数に置き換えます。これには次のような欠点があります。
(1) 時間がかかります
(2) パフォーマンスの問題は解決されません
(3) 問題が発生する可能性が非常に高いです前のものを破棄する コードにより不明なエラーが発生します
(4) 努力は報酬を超えます
プログラムをより最適化するために、ここで言及しなければならない誤解もあります。ビジネス ロジックを分析するときに最適化を考慮して、より良いコードを取得するためにビジネス ロジックを変更する人もいます。プログラムの目的は現実に遭遇する問題を解決し、それらの問題に対処することであるため、これは非常に愚かなアイデアです。