1. 多くのコード ファイル、特に多くのインクルード ファイル (include または require) を含むファイルの場合。中間コードの解析と生成にはさらに時間がかかります。
2. PHP コードファイルに変更がなくても、実行処理は厳密に処理に従って実行されます。つまり、アプリケーション プログラムが変更されるかどうかに関係なく、アプリケーション プログラムを呼び出すたびに再コンパイルしてオペコードを生成する必要があります。 (実際、これがコンパイル キャッシュが存在する理由です)
3. このプロセスはメイン コード ファイル内で発生するだけでなく、すべての include および require に対しても発生します。 (これは引き続き最適化される可能性があります)
どの領域を最適化できますか?
1. このモジュールを毎回ロードしないように mod_php fast-cgi を作成します。このモジュールも毎回 PHP 解釈環境を初期化する必要があります。
2. 毎回コンパイルすることを避けるために、php ファイルのオペコード コードをキャッシュします。
APC を使用してポイント 2 を達成できます。コンパイル キャッシュは PHP 実行中の解析プロセスを削除するため、大量の PHP コードを含むアプリケーションに非常に効果的です。通常の状況では、2 ~ 3 倍以上の速度を上げることができます。多数のインクルード ファイルを含むプロジェクトの場合、コンパイル キャッシュの利点がよりよく発揮されます。
注: インクルードはコンパイル キャッシュによってキャッシュされません。たとえば、main.php と tobeInclude.php という 2 つのファイルがあり、Main.php には include tobeInclude.php というステートメントがあります。中間コードの接尾辞は .op であると仮定します (これは当てはまりません)。次に、キャッシュ main.php=>main.op、tobeInclude.php=>tobeInclude.op を追加した後、ただし、PHP が main.php を実行するときは、依然として main.op 内の include コマンドを解析し、tobeInclude.op のコンテンツを呼び出す必要があります。具体的なプロセスは以下の通りです。
…=>main.opを実行=>tobeInclude.op=>を実行…
単に main.op を実行するのではなく
そのため、「インクルードファイルが多すぎるとプログラムのパフォーマンスが低下する」と言われています。
APC の特定の構成。
Alternative PHP Cache (APC) は、無料で公開されている、PHP 用に最適化されたコード キャッシュです。これは、PHP 中間コードをキャッシュおよび最適化するための、無料でオープンかつ堅牢なフレームワークを提供するために使用されます。
APC の公式 Web サイトは http://pecl.php.net/package/apc です
1.インストール
PHP 拡張機能としてインストール
phpize
./configure --enable-apc --enable-apc-mmap
作る
インストールを行う
.so を生成し、PHP がモジュールを参照するディレクトリに .so をコピーし、アクセス許可を 755 に変更します
2. 設定
apc.enabled ブール値
apc.optimization 最適化
オプションはスクリプトで変更できます
APC PHP.ini 設定オプションの詳細な説明
[APC]
; 代替 PHP キャッシュは、PHP 中間コードのキャッシュと最適化に使用されます
apc.cache_by_default = オン
;SYS
; デフォルトですべてのファイルのバッファリングを有効にするかどうか。
; Off に設定し、プラス記号で始まる apc.filters ディレクティブと一緒に使用すると、ファイルはフィルターに一致する場合にのみキャッシュされます。
apc.enable_cli = オフ
;SYS
; CLI バージョンで APC 機能を有効にするかどうかは、テストとデバッグの目的でのみこのコマンドをオンにします。
apc.enabled = オン
; APC を有効にするかどうか APC が PHP に静的にコンパイルされている場合、これを無効にするしかありません。
apc.file_update_protection = 2
;SYS
; 実行中のサーバー上のファイルを変更するときは、アトミック操作を実行する必要があります。
; つまり、まず一時ファイルに書き込み、次にそのファイルの名前を最終的な名前に変更 (mv) します。
; テキスト エディターや cp や tar などのプログラムはこのように動作しないため、不完全なファイルがバッファリングされる可能性があります。
; デフォルト値 2 は、ファイルにアクセスするときに、変更時間がアクセス時間から 2 秒未満であることが判明した場合、バッファリングは実行されないことを意味します。
; 運が悪い訪問者は不完全なコンテンツを取得する可能性がありますが、その悪影響はキャッシュによって拡大されません。
; すべての更新操作がアトミック操作であることを確認できる場合は、0 を使用してこの機能をオフにすることができます。
; IO 操作が多いためにシステムの更新が遅い場合は、この値を増やす必要がある場合があります。
apc.filters =
;SYS
; POSIX 拡張正規表現のカンマ区切りのリスト。
; ソース ファイル名がいずれかのパターンに一致する場合、ファイルはキャッシュされません。
; マッチングに使用されるファイル名は、絶対パスではなく、include/require に渡されるファイル名であることに注意してください。
; 正規表現の最初の文字が「+」の場合、その式に一致するファイルがキャッシュされることを意味します。
; 最初の文字が「-」の場合、一致するものはキャッシュされません。 「-」はデフォルト値であり省略可能です。apc.ttl = 0
;SYS
; キャッシュ エントリがバッファ内に存在できる秒数。 0 はタイムアウトしないことを意味します。推奨値は7200~36000です。
; 0 に設定すると、バッファが古いキャッシュ エントリでいっぱいになり、新しいエントリがキャッシュされなくなる可能性があります。
apc.user_ttl = 0
;SYS
; apc.ttl と似ていますが、各ユーザーの推奨値は 7200 ~ 36000 です。
; 0 に設定すると、バッファが古いキャッシュ エントリでいっぱいになり、新しいエントリがキャッシュされなくなる可能性があります。
apc.gc_ttl = 3600
;SYS
; キャッシュ エントリがガベージ コレクション テーブルに存在できる秒数。
; この値は、キャッシュされたソース ファイル
の実行中にサーバー プロセスがクラッシュした場合でも安全対策を提供します。; そして、ソースファイルは変更されており、古いバージョンに割り当てられたメモリは、この TTL 値に達するまで再利用されません。
; この機能を無効にするには、ゼロに設定します。
apc.include_once_override = オフ
;SYS
; オフのままにしてください。オフにすると、予期しない結果が生じる可能性があります。
apc.max_file_size = 1M
;SYS
; このサイズより大きいファイルのキャッシュを無効にします。
apc.mmap_file_mask =
;SYS
; MMAP サポートが –enable-mmap (デフォルトで有効) を使用して APC 用にコンパイルされている場合、
; ここでの値は、mmap モジュールに渡される mktemp スタイルのファイル マスクです (推奨値は「/tmp/apc.XXXXXX」です)。
; このマスクは、メモリ マップ領域をファイル バックアップするか共有メモリ バックアップするかを決定するために使用されます。
; ファイルに基づく直接メモリ マッピングの場合は、「/tmp/apc.XXXXXX」 (正確に 6 つの X) に設定します。
; POSIX スタイルの shm_open/mmap を使用するには、「/apc.shm.XXXXXX」に設定する必要があります。
; 「/dev/zero」に設定して、匿名でマップされたメモリにカーネルの「/dev/zero」インターフェイスを使用することもできます。
; このディレクティブを定義しないことは、匿名マッピングの使用を強制することを意味します。
apc.num_files_hint = 1000
;SYS
; Web サーバーに含めたりリクエストしたりできるさまざまなソース ファイルのおおよその数 (推奨値は 1024 ~ 4096)。
; よくわからない場合は、0 に設定してください。この設定は主に、数千のソース ファイルを含むサイトに使用されます。
apc.optimization = 0
; 最適化レベル (推奨値は 0)。
; 正の整数値はオプティマイザーが有効であることを示し、値が大きいほどより積極的な最適化が使用されます。
; 値を大きくすると速度の向上が非常に制限される可能性がありますが、現在は実験段階です。
apc.report_autofilter = オフ
;SYS
; 早期/遅延バインディングにより自動的にキャッシュされないすべてのスクリプトを記録するかどうか。
apc.shm_segments = 1
;SYS
; コンパイラ バッファに割り当てられる共有メモリ ブロックの数 (推奨値は 1)。
; APC が共有メモリを使い果たし、apc.shm_size ディレクティブがシステムで許可される最大値に設定されている場合、
; この値を増やしてみてください。
apc.shm_size = 30
;SYS
; 各共有メモリ ブロックのサイズ (MB 単位、推奨値は 128 ~ 256)。
; 一部のシステム (ほとんどの BSD バリアントを含む) のデフォルトの共有メモリ ブロック サイズは非常に小さいです。
apc.slam_defense = 0
;SYS (このコマンドの使用には反対です。apc.write_lock コマンドを使用することをお勧めします)
; 非常に負荷の高いサーバーでは、サービスの開始またはファイルの変更にかかわらず、
; 複数のプロセスが同時にファイルをキャッシュしようとすると、競合状態が発生する可能性があります。
; このディレクティブは、キャッシュされていないファイルを処理するときにキャッシュ手順をスキップするプロセスの割合を設定するために使用されます。
; たとえば、これを 75 に設定すると、キャッシュされていないファイルが見つかったときに 75% の確率でキャッシュされないため、衝突の可能性が低くなります。
; この機能を無効にするには、これを 0 に設定することをお勧めします。
apc.stat = オン
;SYS
; スクリプトの更新チェックを有効にするかどうか。
; このコマンドの値を変更する場合は十分に注意してください。
; デフォルト値 On は、スクリプトが要求されるたびに APC が更新されたかどうかを確認することを意味します。
; 更新されると、コンパイルされたコンテンツは自動的に再コンパイルされ、キャッシュされます。ただし、これを行うとパフォーマンスに悪影響が生じます。; Off に設定すると、チェックが実行されなくなり、パフォーマンスが大幅に向上します。
; ただし、更新された内容を有効にするには、Web サーバーを再起動する必要があります。
; このディレクティブは include/require ファイルにも有効です。ただし、
に注意してください。
; 相対パスを使用する場合、APC は include/require ごとにファイルの場所を確認する必要があります。; 絶対パスを使用するとチェックがスキップされる可能性があるため、include/require 操作には絶対パスを使用することをお勧めします。
apc.user_entries_hint = 100
;SYS
; num_files_hint ディレクティブに似ていますが、ユーザーごとに異なります。
; よくわからない場合は 0 に設定してください。
apc.write_lock = オン
;SYS
; 書き込みロックを有効にするかどうか。
; 非常に負荷の高いサーバーでは、サービスの開始またはファイルの変更にかかわらず、
; 複数のプロセスが同時にファイルをキャッシュしようとすると、競合状態が発生する可能性があります。
; このディレクティブを有効にすると、競合状態を回避できます。
apc.rfc1867 = オフ
;SYS
; このコマンドをオンにすると、APC は、ファイル フィールドの直前に APC_UPLOAD_PROGRESS フィールドを含むアップロード ファイルごとに、upload_ のユーザー キャッシュ エントリ (つまり、APC_UPLOAD_PROGRESS フィールドの値) を自動的に作成します。
3.php関数
apc_cache_info - APC のデータ ストアからキャッシュされた情報 (およびメタデータ) を取得します
apc_clear_cache - APC キャッシュをクリアします
apc_define_constants - 後で取得および一括定義するための定数のセットを定義します
apc_delete - 保存された変数をキャッシュから削除します
apc_fetch - キャッシュから格納された変数をフェッチします
apc_load_constants - キャッシュから一連の定数をロードします
apc_sma_info - APC の共有メモリ割り当て情報を取得します
apc_store - データ ストアに変数をキャッシュします
4. 注:
Apc と Apache プロセスはメモリを共有するため、Apache プロセスが実行される場合にのみ値を apc に保存できます。通常の PHP プロセスは APC 共有メモリにアクセスできません。
第 2 章 PHP のパフォーマンスを向上させるコーディング手法
0. 文字列を含めるには二重引用符の代わりに一重引用符を使用すると高速になります。 PHP は二重引用符で囲まれた文字列内の変数を検索しますが、一重引用符は検索しません。 注: これを実行できるのは echo だけです。これは複数の文字列をパラメータとして受け取ることができる「関数」です (注釈: PHP マニュアル echo は実際の関数ではなく言語構造であるため、関数は二重引用符で囲まれています)。
1. クラスメソッドを静的に定義できる場合は、クラスメソッドを静的に定義してみると、速度が 4 倍近く向上します。
2. $row[’id’] の速度は $row[id] の 7 倍です。
3. Echo は print より高速で、echo $str1、$str2 などの文字列連結の代わりに echo の複数のパラメータ (注釈: ピリオドの代わりにカンマを使用することを指します) を使用します。
4. for ループを実行する前に最大ループ数を決定します。ループごとに最大値を計算するのではなく、代わりに foreach を使用することをお勧めします。
5. 未使用の変数、特に大きな配列の登録を解除して、メモリを解放します。
6. __get、__set、__autoload の使用は避けてください。
7. require_once() は高価です。
8. ファイルをインクルードする場合は、絶対パスを使用するようにしてください。これにより、include_path 内のファイルを検索する PHP の速度が低下し、オペレーティング システムのパスの解析に必要な時間が短縮されるためです。
9. スクリプトの実行開始時刻 (アノテーション: つまり、サーバーがクライアント要求を受信する時刻) を知りたい場合は、time() よりも $_SERVER[‘REQUEST_TIME’] を使用する方が適切です。
10. 関数は正規表現を置き換えて同じ関数を完成させます。
11. str_replace 関数は preg_replace 関数よりも高速ですが、strtr 関数は str_replace 関数よりも 4 倍効率的です。
12. 文字列置換関数がパラメータとして配列または文字を受け入れることができ、パラメータの長さが長すぎない場合は、渡される各パラメータが 1 文字ではなく 1 文字になるように追加の置換コードを記述することを検討できます。このコードは、クエリと置換のパラメータとして配列を受け入れます。
13. 複数の if、else if ステートメントを使用するよりも、選択的分岐ステートメント (翻訳アノテーション: switch case) を使用する方が良いです。
14. @ を使用してエラー メッセージをブロックするのは非常に非効率的です。
15. Apache の mod_deflate モジュールを開くと、Web ページの閲覧速度が向上します。
16. データベース接続は、使用が終了したら閉じる必要があり、長い接続を使用しないでください。
17. エラーメッセージは高価です。
18. メソッド内でローカル変数を増やすのが一番早い。関数内でローカル変数を呼び出すのとほぼ同じ速度です。
19. グローバル変数のインクリメントは、ローカル変数のインクリメントより 2 倍遅くなります。
20. オブジェクト プロパティ ($this->prop++ など) のインクリメントは、ローカル変数のインクリメントより 3 倍遅くなります。
21. 未定義のローカル変数をインクリメントするのは、事前定義されたローカル変数をインクリメントするよりも 9 ~ 10 倍遅くなります。
22. 関数内で呼び出さずにローカル変数を定義しただけでも、(ローカル変数をインクリメントするのと同じ程度に)速度が低下します。 PHP はおそらく、グローバル変数が存在するかどうかを確認します。
23. 10 個のメソッド (テスト メソッドの前後の両方) を追加したため、メソッド呼び出しはクラスで定義されているメソッドの数に依存していないように見えますが、パフォーマンスに変化はありませんでした。
24. 派生クラスのメソッドは、基本クラスで定義された同じメソッドよりも高速に実行されます。
25. 1 つのパラメーターを指定して空の関数を呼び出すと、ローカル変数のインクリメント操作を 7 ~ 8 回実行するのと同じ時間がかかります。同様のメソッド呼び出しには、15 近くのローカル変数のインクリメント操作が必要です。
26. Apache が PHP スクリプトを解析するのにかかる時間は、静的な HTML ページを解析する場合よりも 2 ~ 10 倍遅くなります。使用する静的な HTML ページを増やし、スクリプトを減らすようにしてください。
27. スクリプトをキャッシュできない限り、呼び出されるたびに再コンパイルされます。 PHP キャッシュ メカニズムを導入すると、通常、コンパイルのオーバーヘッドが排除され、パフォーマンスが 25% ~ 100% 向上します。
28. できるだけキャッシュするようにしてください。memcached を使用できます。 Memcached は、動的 Web アプリケーションを高速化し、データベースの負荷を軽減するために使用できる高性能メモリ オブジェクト キャッシュ システムです。 OP コードのキャッシュは、リクエストごとにスクリプトを再コンパイルする必要がないように便利です。
29. 文字列を操作し、その長さが特定の要件を満たしているかどうかを確認する必要がある場合、当然 strlen() 関数を使用します。この関数は計算を行わず、zval 構造体 (PHP 変数の格納に使用される C の組み込みデータ構造体) に格納されている既知の文字列長を返すだけなので、かなり高速に実行されます。ただし、strlen() は関数であるため、関数呼び出しは小文字などの多くの手順を経るため、多少遅くなります (注釈: 小文字の関数名を指します。PHP は関数名の大文字と小文字を区別しません)。 )、ハッシュ検索、呼び出された関数と一緒に実行されます。場合によっては、 isset() トリックを使用してコードの実行を高速化できます。
(例は以下の通り)
if (strlen($foo)
(以下のテクニックと比較してください)
if (!isset($foo{5})) { echo “Foo は短すぎます”$$ }
isset() の呼び出しは、strlen() よりも高速です。これは、後者とは異なり、言語構造としての isset() の実行に関数の検索と小文字が必要ないためです。つまり、実際には、最上位コードで文字列の長さをチェックするオーバーヘッドはそれほどかかりません。
34. 変数 $i のインクリメントまたはデクリメントを実行する場合、$i++ は ++$i よりも遅くなります。この違いは PHP に固有のものであり、他の言語には当てはまりません。そのため、C または Java コードを変更して、すぐに高速になることを期待しないでください。実際には機能しません。 ++$i は 3 つの命令 (オペコード) しか必要としないため高速ですが、$i++ は 4 つの命令を必要とします。ポストインクリメントでは、実際には、後でインクリメントされる一時変数が作成されます。プレフィックスの増分は、元の値に直接増加します。これは、Zend の PHP オプティマイザーによって行われるような、最適化の一種です。すべてのコマンド オプティマイザーが同じ最適化を実行するわけではなく、コマンド オプティマイザーがインストールされていないインターネット サービス プロバイダー (ISP) やサーバーが多数存在するため、この最適化を念頭に置くことをお勧めします。
35. すべてがオブジェクト指向 (OOP) である必要はなく、オブジェクト指向は多くの場合非常に高価であり、各メソッドとオブジェクトの呼び出しは大量のメモリを消費します。
36. すべてのデータ構造を実装するためにクラスを使用する必要はありません。配列も非常に便利です。
37. メソッドを細分化しすぎないでください。実際にどのコードを再利用するのかをよく考えてください。
38. 必要なときはいつでもコードをメソッドに分割できます。
39. PHPの組み込み関数をたくさん使ってみてください。
40. コード内に時間のかかる関数が多数ある場合は、C 拡張機能を使用して実装することを検討できます。
41. コードのプロファイリングを行います。チェッカーは、コードのどの部分にどれくらいの時間がかかっているかを示します。 Xdebug デバッガーには、コードの全体的な整合性を評価し、コード内のボトルネックを明らかにする検査ルーチンが含まれています。
42. mod_zip を Apache モジュールとして使用すると、データを瞬時に圧縮し、データ送信量を 80% 削減できます。
43. file、fopen、feof、fgets などの一連のメソッドの代わりに file_get_contents を使用できる場合は、より効率的な file_get_contents を使用してください。ただし、URL を開くときは、file_get_contents の PHP バージョンの問題に注意してください。ファイル。
44. PHP のファイル操作効率は低くありませんが、ファイル操作はできるだけ少なくします
45. Select SQL ステートメントを最適化し、実行する挿入操作と更新操作をできるだけ少なくします。
46. PHP の内部関数をできるだけ使います (ただし、PHP に存在しない関数を見つけるために、カスタム関数を書くことで本来書ける時間を無駄にしてしまいました。これは経験の問題です!) ;
47. ループ内で変数、特に大きな変数を使用しないでください: オブジェクト (これは PHP だけの問題ではないようです?)
48. 多次元配列で代入をループしたり入れ子にしたりしないようにしてください。
49. PHP の内部文字列操作関数を使用できる場合は、正規表現を使用しないでください。
50. foreach の方が効率的です。while や for ループの代わりに foreach を使用してみてください。51. 文字列を引用するには二重引用符の代わりに一重引用符を使用します。
52. "i=i+1 の代わりに i+=1 を使用します。これは C/C++ の習慣に従っており、より効率的です。"
53. グローバル変数は使用時に unset() する必要があります。