プログラムを作成するとき、私たちは常に、プログラムが使用するリソースを最小限に抑え、より高速に実行され、コードが少なくなるようにしたいと考えます。これらを追求している間に、私たちは多くのものを失うことがよくあります。次に、PHP 最適化 についての私の理解を話したいと思います。最適化の目的は、最速の実行速度と最も簡単なコードの保守と引き換えに、最小限のコストを費やすことです。
特定のプログラムコードをいじるのではなく、大規模な最適化を実行してください
ここで私が話している最適化は基本的にサーバー、Apache、データベースの側面からの最適化であり、あなたのためのものではありませんPHPコードを改善して、プログラムの実行速度を向上させるため、プログラム内の正規表現を文字列処理関数に最適化してプログラムの速度を向上させる場合と比較して、広範囲にわたる最適化のコストははるかに小さくなりますが、その見返りははるかに寛大です。 。
コード以外の領域での最適化には次の利点があります:
1. 通常、効率が大幅に向上します
2. コードの整合性が損なわれることはありません
3. キャッシュ テクノロジ
一般的に使用されるキャッシュ テクノロジについて話しましょう。これらのキャッシュ テクノロジは効率を大幅に向上させることができます。Memcached は、主に WEB ダイナミックの高速化に使用される、効率的で高速な分散メモリ オブジェクト キャッシュ システムです。アプリケーション。
Memcached の原理
memcached は 1 つ以上のサーバーでデーモンとして実行され、クライアントからの接続操作の受信を待機します。クライアントはさまざまな言語 (PHP など) で記述できます。 PHP などのクライアントが memcached サービスとの接続を確立したら、次にアクセスするオブジェクトには一意の識別子キーがあり、アクセス操作は memcached に保存されます。 、キャッシュ ファイルに保存されないため、memcached は非常に効率的かつ高速になります。memcached について話した後、一般的に使用されるキャッシュ方法について話しましょう
1. コンパイルと OPCODE キャッシュ
PHP はインタープリタ型言語であるため、同じファイルにアクセスする場合は、実行前に各 PHP ファイルをコンパイルする必要があります。異なるユーザーが同じファイルにアクセスしたり、同じユーザーが異なる時間に同じファイルにアクセスしたりすると、毎回再コンパイルして実行する必要があり、時間がかかります。コンパイルとキャッシュにより、各ファイルは変更後に 1 回だけコンパイルされるため、ファイル IO 操作が軽減されます。ユーザーがアクセスした後、機械語命令はハードディスクから読み取られるのではなく、メモリから直接フェッチされて実行されます。
最も一般的な PHP コンパイル キャッシュ ツールは次のとおりです: APC、Accelerator、xcache2. グローバル ページ キャッシュ -- Squid Cache
Squid Cache (Squid と呼ばれます) は人気のあるフリー ソフトウェア (GNU General Public License) ) (証明書) プロキシ サーバーと Web キャッシュ サーバー。Squid は Web サーバーのフロント キャッシュ サーバーとして機能し、関連するリクエストをキャッシュすることで Web サーバーの速度を向上させます。
3. SQL キャッシュのローカル キャッシュ
SQL キャッシュの例 (memcached 拡張機能を使用)
コード スニペット:<ol class="dp-c"> <li class="alt"><span><span class="vars">$key</span><span> = md5(“some sort of sql query”); </span></span></li> <li> <span class="keyword">if</span><span> (!(</span><span class="vars">$result</span><span> = memcache_get(</span><span class="vars">$key</span><span>))) { </span> </li> <li class="alt"> <span class="vars">$result</span><span> = </span><span class="vars">$pdo</span><span>->query(</span><span class="vars">$qry</span><span>)->fetchAll(); </span> </li> <li> <span class="comment">// 缓存查询结果一小时 </span><span> </span> </li> <li class="alt"> <span>memcache_set(</span><span class="vars">$key</span><span>, </span><span class="vars">$result</span><span>, NULL, 3600); </span> </li> <li><span>} </span></li> </ol>
4. ローカル キャッシュ コード ブロック キャッシュ
PHP プログラムを最適化するために、各コード セグメントを最適化して、実行時間は少しかかりますが、さまざまな複雑な PHP コード セグメントを最適化する場合と比較して、キャッシュによるこれらのコード セグメントの最適化を直接無視する方が良いです。次のような利点があります。
1. 効果をすぐに確認できます。前のコードは破壊されません
<ol class="dp-c"> <li class="alt"><span><span class="keyword">function</span><span> complex_function_abc(</span><span class="vars">$a</span><span>, </span><span class="vars">$b</span><span>, </span><span class="vars">$c</span><span>) { </span></span></li> <li> <span class="vars">$key</span><span> = </span><span class="keyword">__FUNCTION__</span><span> . serialize </span> </li> <li class="alt"><span>(func_get_args()); </span></li> <li> <span class="keyword">if</span><span> (!(</span><span class="vars">$result</span><span> = memcache_get(</span><span class="vars">$key</span><span>))) { </span> </li> <li class="alt"> <span class="vars">$result</span><span> = </span><span class="comment">//函数代码 </span><span> </span> </li> <li> <span class="comment">// 储存执行结果1小时 </span><span> </span> </li> <li class="alt"> <span>memcache_set(</span><span class="vars">$key</span><span>, </span><span class="vars">$result</span><span>, NULL, 3600); </span> </li> <li><span>} </span></li> <li class="alt"> <span class="keyword">return</span><span> </span><span class="vars">$result</span><span>; </span> </li> <li><span>} </span></li> </ol>
出力制御
上記のキャッシュ技術に加えて、出力制御はプログラムの実行時間を短縮するためにも使用できますPHP と APACHE による出力制御についてお話しましょう1 ここで。最も重要なものは ob_start() と PHP の OB シリーズ関数です。これらの関数は何ができるのでしょうか?
1 つ目は静的テンプレート技術です。いわゆる静的テンプレート技術は、特定のメソッドを使用して、ユーザーがクライアント側の PHP によって生成された HTML ページを取得できるようにします。この HTML ページが更新されなくなると、別のユーザーがこのページを再度閲覧したときに、sina、163、sohu などの大量の情報を含む一部の Web サイトでは、プログラムが PHP および関連データベースを呼び出すことはなくなります。このようなテクノロジーの恩恵は非常に大きいです。
コード例:
<ol class="dp-c"> <li class="alt"><span><span><?php </span></span></li><li><span>ob_start(); </span><span class="comment">//打开缓冲区 </span><span> </span></li><li class="alt"><span>?> </span></span></li> <li><span>php页面的全部输出 </span></li> <li class="alt"><span><? </span></li><li><span class="vars">$content</span><span> = ob_get_contents(); </span><span class="comment">//取得php页面输出的全部内容 </span><span> </span></li><li class="alt"><span class="vars">$fp</span><span> = </span><span class="func">fopen</span><span>(</span><span class="string">"output.html"</span><span>, </span><span class="string">"w"</span><span>); </span><span class="comment">//创建一个文件,并打开,准备写入 </span><span> </span></li><li><span>fwrite(</span><span class="vars">$fp</span><span>, </span><span class="vars">$content</span><span>); </span><span class="comment">//把php页面的内容全部写入output.html,然后…… </span><span> </span></li><li class="alt"><span>fclose(</span><span class="vars">$fp</span><span>); </span></li><li><span>?> </span></li> </ol>
もちろん、この ob シリーズ関数には他にも多くの用途がありますが、ここでは 1 つずつ説明しません。
2. Apache 出力制御SendBufferSize をページ サイズに設定すると、ページを一度に送信バッファーに配置して処理速度が向上します。
SendBufferSize コマンド
説明: TCP 送信バッファ サイズ (バイト)
構文: SendBufferSize バイト
デフォルト値: SendBufferSize 0
スコープ: サーバー構成
ステータス: MPM
モジュール: beos、mpm_netware、mpm_winnt 、m pmt_os2、 prefork、worker
このコマンドは、サーバーの TCP 送信バッファのサイズ (バイト) を設定します。この値を増やすと、高速化と高遅延 (約 100ms) という 2 つの影響が生じます。 「0」に設定すると、オペレーティング システムのデフォルトが使用されます。
ソース コードを通じて Apache/PHP/データベースをコンパイルすると、プログラムの速度が 10 ~ 15% 向上します
次に、コードを最適化するときに注意すべき点について説明します
1 短いコードではありません。高速コード
多くの人は、プログラムを作成するときにできるだけ簡潔にコードを記述したいと考えますが、コードが短いほど実行に時間がかかる場合があるため、コードを多く使用する場合でも、低速コードを使用しないでください。プログラムを作成するときは、速度を追求するのではなく、プログラムのスケーラビリティにもっと注意を払う必要があります
3. ほとんどのアプリケーションのボトルネックはデータベースではなく、コードを最適化する前に、まずデータベースに関連する部分に注目してください。コード
4. マイクロ最適化は良いことよりも害を及ぼす
マイクロ最適化とは何ですか?前述したように、コードの正規表現部分を文字列関数に置き換えます。これを行うと、次のような欠点があります:
(1) 時間がかかります
(2) パフォーマンスの問題は解決されません
(3) 以前のコードが破損し、不明なエラーが生成される可能性が非常に高くなります
(4)労力はリターンより大きい
ここで一つ誤解がありますが、プログラムをより最適化するために、ビジネスロジックを分析する際に最適化を考慮して、ビジネスロジックを順番に変更する人がいます。より良いコードを取得するために。プログラムの目的は現実に遭遇する問題を解決し、それらの問題に対処することであるため、これは非常に愚かなアイデアです。
http://www.bkjia.com/PHPjc/445802.html