ホームページ  >  記事  >  バックエンド開発  >  PHP最適化の詳しい説明_PHPチュートリアル

PHP最適化の詳しい説明_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-20 11:13:081184ブラウズ

著者が収集したこれらのヒントは幅広い情報源から得ており、完全性は保証できません。 数が多いため、これらの最適化手法はテストされていません。結局のところ、これらのテクニックが役立つかどうかは、PHP が配置されている固有の環境に依存します。

ディレクトリインデックス

ボトルネックの発見

パフォーマンスの問題に直面したとき、最初のステップは、ヒントのリストを見るのではなく、常に問題の原因を見つけることです。ボトルネックの原因を理解し、ターゲットを見つけて修正を実装し、再度テストします。ボトルネックを見つけることは、数千マイルにわたる長い旅の最初のステップにすぎません。最も重要な最初のステップでボトルネックを見つけるのに役立つことを願っています。

  • 監視手法 (監視トレジャーなど) を使用して、ネットワーク、特にネットワーク状態は急速に変化します。うまく行えば、ボトルネックを 5 分で見つけることができます。
  • コードを分析します。コードのどの部分に最も時間がかかるかを理解し、これらの部分にさらに注意を払う必要があります。
  • ボトルネックを見つけるには、各リソース要求 (ネットワーク、CPU、メモリ、共有メモリ、ファイル システム、プロセス管理、ネットワーク接続など) を確認します
  • 最初に反復構造と複雑なコードのベンチマークを実行します
  • 実際の負荷の下で実際のデータを使用して実際のテストを実行します。もちろん、可能であれば実稼働サーバーを使用するのが最善です。

キャッシング

キャッシュがパフォーマンスの問題を解決する最も効果的な方法の 1 つであると考える人もいます。次のことを試してください:

  • OPCODE (オペレーション コード) キャッシュを使用して、スクリプトがアクセスされるたびに再コンパイルされないようにします。たとえば、Windows プラットフォームで Windows キャッシュ拡張機能を有効にします。オペコード、ファイル、相対パス、セッション データ、ユーザー データをキャッシュできます。
  • マルチサーバー環境で分散キャッシュの使用を検討してください
  • imap_header() を呼び出す前に imap_headers() を呼び出してください

コンパイル vs. インタープリタ

PHP ソースコードをマシンコードにコンパイルします。動的解釈は同じコンパイルを実行しますが、行ごとに実行されます。オペコードへのコンパイルは妥協であり、PHP ソース コードをオペコードに変換し、そのオペコードをマシン コードに変換できます。以下は、コンパイルと解釈に関する関連するヒントです:

  • オンラインにする前に、PHP コードをマシンコードにコンパイルします。オペコードのキャッシュは最良の選択ではありませんが、それでも解釈されるよりは優れています。あるいは、PHP コードを C 拡張機能にコンパイルすることを検討してください。
  • PHP のオペコード コンパイラー (bcompiler) は実稼働環境ではまだ利用できませんが、開発者は http://php.net/manual/en/book.bcompiler.php.
  • に注意する必要があります。

コードの減量 (コンテンツの削減)

少ないほど良いです。 これらのヒントはコードを減らすのに役立ちます:

  • ページごとの機能が少なくなります
  • クリーンなウェブコンテンツ
  • 解釈された実行の場合は、コメントやその他の空白をクリーンアップしてください
  • データベースクエリを削減

マルチスレッドとマルチプロセッシング

最も速いものから最も遅いものまで:

PHP はマルチスレッドをサポートしていませんが、C でマルチスレッド PHP 拡張機能を作成できます。複数のプロセスを使用したり、複数のプロセスをシミュレートする方法はいくつかありますが、サポートがあまり良くなく、単一プロセスよりも遅くなる可能性があります。

文字列

文字列処理は、ほとんどのプログラミング言語で最も一般的に使用される操作の 1 つです。文字列処理を高速化するためのヒントをいくつか紹介します:

  • PHPの接続操作(ポイント操作)が最速のリンク方法です
  • 印刷では文字列の連結を避け、カンマで区切ってECHOを使用してください
  • 可能な限り、正規表現の代わりに str_ という接頭辞が付いた文字列関数を使用してください
  • pos() は preg_mach() や ereg() よりも高速です
  • 文字列を一重引用符で囲む方が二重引用符よりも速いという人もいますが、違いはないと言う人もいます。もちろん、文字列内の変数を引用符で囲みたい場合は、一重引用符は役に立ちません。
  • 文字列の長さが特定の値(5 など)より小さいかどうかを判断したい場合は、isset($s[4])
  • 複数の小さな文字列を 1 つの大きな文字列に連結する必要がある場合は、まず ob_start 出力キャッシュを有効にしてから、echo を使用してバッファに出力し、次に ob_get_contents を使用して文字列を読み取ります

正規表現

正規表現は、文字列を比較および検索するための柔軟で多様な方法を提供しますが、そのパフォーマンスのオーバーヘッドは実際には低くありません

  • 可能な限り、正規表現の代わりに STR_ というプレフィックスが付いた文字列処理関数を使用してください
  • (a|e|i|o|u)の代わりに[aeiou]を使用してください
  • 正規表現が単純であればあるほど高速になります
  • 可能な場合は PCRE_DOTALL 修飾子を設定しないでください
  • .* の代わりに ^.* を使用してください
  • 正規表現を簡素化します。 (たとえば、(a+)* の代わりに a* を使用します

反復構成 (for、while)

イテレーション (反復、ループ) は最も基本的な構造化プログラミング手法であり、これを使用しないプログラムを想像するのは困難です。反復構造のパフォーマンスを向上させるのに役立つヒントをいくつか紹介します:

  • コードを可能な限りループ外に移動します (関数呼び出し、SQL クエリなど)
  • for(i=0;i
  • foreach を使用してコレクションと配列を反復処理します

選択構造 (if、switch)

反復構造と同様に、選択構造も最も基本的な構造変換手法です。次のヒントによりパフォーマンスが向上する可能性があります:

  • スイッチとelse-ifのうち、最近よくtrueになるものを前に、めったにtrueにならないものを後ろにリストします
  • if-else は switch/case よりも速いという人もいます。もちろん反対する人もいます。
  • else if の代わりに elseif を使用してください。

関数とパラメータ

関数のコードを小さな関数コードに分割すると、冗長性が排除され、コードが読みやすくなりますが、その代償はどれくらいでしょうか?関数をより効果的に使用するためのヒントをいくつか紹介します:

  • オブジェクトと配列を値ではなく参照によって渡します
  • 1 か所のみで使用する場合は、インラインで使用します。複数の場所で呼び出される場合はインライン化を検討してください。ただし、保守性には注意してください
  • 使用する関数の複雑さを理解します。例えば、similar_text() は O(N^3) なので、文字列長が 2 倍になると処理時間は 8 倍になります
  • 「参照を返す」ことでパフォーマンスを向上させないでください。エンジンは自動的に最適化します。
  • call_user_func_array() や eval() を使用する代わりに、通常の方法で関数を呼び出します

オブジェクト指向構造

PHP のオブジェクト指向機能はパフォーマンスに影響を与える可能性があります。次のヒントは、この影響を最小限に抑えるのに役立ちます:

  • すべてをオブジェクト指向にする必要はありません。パフォーマンスの損失が利点自体を上回る可能性があります
  • オブジェクトの作成が遅い
  • 可能であれば、可能な限りオブジェクトの代わりに配列を使用してください
  • メソッドを静的にできる場合は、静的に宣言してください
  • 関数呼び出しは派生クラスのメソッド呼び出しよりも高速であり、派生クラスのメソッド呼び出しは基本クラスの呼び出しよりも高速です
  • 最も一般的に使用されるコードを基本クラスから派生クラスにコピーすることを検討してください。ただし、メンテナンス上の危険に注意してください
  • ネイティブのゲッターとセッターの使用は避けてください。不要な場合は削除してプロパティを公開してください
  • 複雑な PHP クラスを作成する場合は、シングルトン パターンの使用を検討してください

セッション処理

セッションの作成には多くの利点がありますが、場合によっては不必要なパフォーマンスのオーバーヘッドが発生することがあります。次のヒントは、パフォーマンスのオーバーヘッドを最小限に抑えるのに役立ちます:

  • auto_start を使用しないでください
  • use_trans_sidを有効にしないでください
  • session_cache_limited を private_no_expire に設定します
  • 仮想ホスト (vhost) 内の各ユーザーに独自のディレクトリを割り当てます
  • ファイルベースのセッション処理の代わりにメモリベースのセッション処理を使用します

型キャスト

あるタイプから別のタイプへの変換にはコストがかかります

圧縮

送信前にテキストとデータを圧縮します:

  • コードの先頭で ob_start() を使用します
  • ダウンロードを高速化するには ob_gzhandler() を使用しますが、CPU オーバーヘッドに注意してください
  • Apache の mod_gzip モジュールは即座に圧縮できます

エラー処理

エラー処理はパフォーマンスに影響します。私たちにできることは:

  • エラー ログを記録する。エラー レポートを抑制するために「@」を使用しないでください。
  • エラーログをチェックするだけでなく、警告ログも処理する必要があります

宣言、定義、スコープ

変数、配列、またはオブジェクトの作成はパフォーマンスに影響します:

  • グローバル変数/オブジェクトを宣言して使用する方がローカル変数/オブジェクトよりも速いという人もいますが、反対する人もいます。決める前にテストしてください。
  • すべての変数を使用する前に宣言し、未使用の変数を宣言しないでください
  • ループ内では可能な限り $a[] を使用し、$a=array(…) の使用を避けてください

メモリリーク

メモリが割り当てられているのに解放されない場合、これは間違いなく問題です:

  • リソースの解放を要求し、組み込み/自動ガベージ コレクションを期待しないでください
  • 使用後は変数、特にリソースクラスや大きな配列型の設定を解除するようにしてください
  • 使用後はデータベース接続を閉じます
  • ob_start() を使用するたびに、ob_end_flush() または ob_end_clean() を思い出してください

車輪の再発明はやめましょう

なぜ他の人がすでに解決している問題の解決に時間を費やす必要があるのでしょうか?

  • PHP、その機能、拡張機能について学びます。知らないと、既製の機能の一部を利用できない可能性があります
  • 組み込みの配列関数と文字列関数を使用すると、間違いなく最高のパフォーマンスを発揮します。
  • 先人が発明したホイールが環境内のエネルギーを吸収するのに最適であるという意味ではありません、もっとテストしてください

コードの最適化

  • オペコードオプティマイザーを使用する
  • 解釈して実行する場合は、ソースコードを簡略化してください

DASDの代わりにRAMを使用する

RAM はディスクよりもはるかに高速であり、RAM を使用するとパフォーマンスが向上します:

  • ファイルを Ramdisk に移動する
  • ファイルベースのセッション処理の代わりにメモリベースのセッション処理を使用します

サービスの使用 (例: SQL)

SQL はリレーショナル データベースにアクセスするためによく使用されますが、PHP コードはさまざまなサービスにアクセスできます。サービスにアクセスする際に留意すべき点がいくつかあります:

  • サーバーに東方について何度も質問しないでください。メモ化を使用して最初の結果をキャッシュすると、以降のアクセスはキャッシュに直接保存されます
  • SQL では、mysql_fetch_array() の代わりに mysql_fetch_assoc() を使用して、結果セット内の整数インデックスを減らします。結果セットにはインデックス番号ではなくフィールド名でアクセスします。
  • Oracle データベースの場合、使用可能なメモリが十分でない場合は、oci8.default_prefetch を増やします。 oci8.statement_cache_size をアプリケーション内のステートメントの数に設定します
  • 結果セットが処理のために他のレイヤーに送信される場合を除き、mysqli_fetch_all() の代わりに mysqli_fetch_array() を使用してください。

インストールと構成

PHP をインストールして構成するときは、パフォーマンスを考慮してください:

  • メモリを追加
  • 競合するアプリやサービスを削除する
  • 必要な拡張機能のみをコンパイルします
  • PHP を APACHE に静的コンパイルする
  • -O3 CFLAGS を使用してすべてのコンパイラの最適化を有効にします
  • 必要なモジュールのみをインストールしてください
  • 最新のマイナーバージョンにアップグレードします。マザーボードをアップグレードするときは、最初のバグが修正されるまで待ってください。もちろん、あまり長く待たないでください。
  • マルチCPU環境用に構成する
  • -enable-inline-optimization を使用する
  • session.save_handler=mm を設定し、-with-mmto でコンパイルし、共有メモリを使用します
  • RAMディスクを使用する
  • register_global と magic_quotes_* をオフにする
  • expose_phpを閉じる
  • 使用する必要がない限り、always_populate_raw_post_data をオフにしてください
  • 非コマンドラインモードでは register_argc_argv をオフにしてください
  • PHP は .php ファイル内でのみ使用してください
  • max_execution_time、max_input_time、memory_limit、output_bufferingのパラメータを最適化します
  • ファイル/ディレクトリのアクセス速度を向上させるには、Apache 構成ファイルのallowoverride を none に設定します
  • -march、-mcpu、-msse、-mmmx、および -mfpmath=sseto を使用して CPU を最適化します
  • MySQL ネイティブ ドライバー (mysqlnd) を使用して、libmysql、mysqli 拡張機能、および PDO MYSQL ドライバーを置き換えます
  • register_globals、 register_long_arrays 、 register_argc_argv をオフにします。
  • auto_globals_jit をオンにします。

その他

分類するのが難しいスキルもいくつかあります:

    include()、require() を使用し、include_once() と require_once() は避けてください
  • include()/require() で絶対パスを使用する
  • 静的 HTML は PHP によって生成された HTML より高速です
  • 正規表現の代わりに ctype_alnum、ctype_alpha、ctype_digital を使用します
  • 単純なサーブレットまたは CGI を使用する
  • 本番環境でコードを使用する場合は、可能な限りログを記録します
  • 出力バッファリングを使用する
  • $a==null を比較する代わりに isset($a) を使用してください。 is_nul($a) の代わりに $a===null を使用してください。
  • スクリプトの実行開始時間が必要です。time()を使用する代わりに$_SERVER[’REQUEST_TIME’]を直接読んでください
  • printの代わりにechoを使用してください
  • ポストインクリメント (i++) の代わりにプレインクリメント (++i) を使用してください。ほとんどのコンパイラーは最適化しますが、最適化されない場合は、このように記述し続けてください。
  • XML を処理し、DOM や SAX の代わりに正規表現を使用します
  • ハッシュアルゴリズム: md4、md5、crc32、crc32b、sha1は他のハッシュ速度より高速です
  • spl_autoload_extensions を使用する場合は、ファイル拡張子を最も一般的に使用されるものから最も一般的に使用されないものの順に並べ、まったく使用されないものは除外するようにしてください。
  • fsockopen または fopen を使用する場合は、ドメイン名の代わりに IP アドレスを使用します。ドメイン名が 1 つしかない場合は、gethostbyname() を使用して IP アドレスを取得します。 cURL を使用すると高速になります。
  • 可能な限り、動的コンテンツを静的コンテンツに置き換えます。
  • www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/440393.html技術記事著者が収集したこれらのヒントは幅広い情報源から得たものであり、その完全性は保証されません。 数が多いため、これらの最適化手法はテストされていません。結局のところ、使用する前に自分でテストしてください...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。