サーバーにソフトウェアをインストールせずにPHPスクリプトのパフォーマンス/速度を上げるにはどうすればよいですか?
13 に答える
プロフィール。プロフィール。プロフィール。PHPに何かがあるかどうかはわかりませんが、コードにプロファイリング情報を挿入するための小さなツールを作成するのは簡単なはずです。関数時間とSQLクエリ時間をプロファイリングする必要があります。
だからあなたが関数を持っているところ:
function foo($stuff) {
...
return ...;
}
私はそれを次のように変更します:
function foo($stuff) {
trace_push_fn('foo');
...
trace_pop_fn('foo');
return ...;
}
(これは、関数内の複数の戻りが妨げになるケースの1つです。)
そしてSQL:
function bar($stuff) {
trace_push_fn('bar');
$query = ...;
trace_push_sql($query);
mysql_query($query);
trace_pop_sql($query);
trace_pop_fn('bar');
return ...;
}
最終的に、プログラム実行の完全なトレースを生成し、あらゆる種類の手法を使用してボトルネックを特定できます。
すぐに使える妥当な手法の 1 つにキャッシングがあります。リクエスト間で (さらにはクライアント間でさえも) 共通するクライアントのリソースを生成するには、膨大な時間がかかる傾向があります。この実行時の作業をなくすと、速度が劇的に向上する可能性があります。生成されたリソース (またはリソース フラグメント) を Web ツリーの外部のファイルにダンプし、必要なときに読み戻すことができます。明らかに、これが再生成よりも実際に高速であることを確認するには、何らかのプロファイリングが必要です。Web サーバーを定期的にディスクに強制的に戻すことは有害な場合があるため、リソースを頻繁に再利用する必要があります。
また、不適切に作成されたデータベース クエリ内でどれだけの時間が費やされているかに驚くかもしれません。生成された一般的なクエリを実行し、それらが書き換え可能かどうかを確認します。実際の PHP コードの実行に費やされる時間は、最適化されていないアルゴリズムを使用していない限り、通常はかなり限られています。
これらはいずれも PHP に限定されたものではありませんが、PHP の「魔法の」アプローチ/関数の中には、これらの懸念について考えないように過度に保護するものがあります。たとえば、私は最近、array_search を使用してソートされた配列に対してバイナリ検索を使用するスクリプトを更新し、予想される指数関数的な速度向上を得ました。
XDebugプロファイラーの使用を実際に検討してください。これは、特定の関数が実行されている量を、期待したものに対してチェックするのに役立ちます。
必要に応じてロジックを配列ルックアップに置き換えることで、コードの可読性を向上させながら、命令を減らすようにしています。それは、ジェフ・アトウッドが[最高のコードはコードがまったくない][1]に書いたものです。
- また、別のループ内のループや、ネストされたif/elseステートメントは避けてください。
- 短い機能。結果値がすでにわかっている場合は、多くのコードを実行する必要がない場合があります。
不必要なテスト:
if(count($ array)=== 0)return;
次のように書くこともできます:
if(!$ array)return;
別の関数呼び出しが削除されました!
[1]: http: //www.codinghorror.com/blog/archives/000878.html「最良のコードはコードがまったくない」
次の 2 つの基本的な方法でコードを最適化できます。
PHP 関連のライブラリとサーバーの最適化
https://www.digitalocean.com/community/articles/how-to-optimize-apache-web-server-performanceまたは_
xhprof のようなプロファイリング ツールを使用して、コードのどの部分を最適化できるかを確認できます。
コード プロファイラーとコード アナライザーを使用してコードを最適化する
このプラグインを使用するには、Netbeans をインストールする必要があります。従う必要がある手順は次のとおりです。
1) NetBeans を開き、メニュー バーの [ツール] > [プラグイン] からオプションを選択します。次に、使用可能なプラグイン タブでプラグイン名「phpcsmd」を検索し、そこからインストールします。
2) ターミナルを開き、コマンド「sudo su」を入力して、スーパー ユーザーとしてそこにいます。
3) 端末で次のコマンドを実行して、PEAR ライブラリ (インストールされていない場合) をシステムにインストールします。
a) wget http://pear.php.net/go-pear.phar
b) php go-pear.phar
これは、追加のアドオンをインストールするために必要です。
4) 次に、コマンドを実行します
"pear config-set auto_discover 1"
これは、必要なプラグインの自動検出パスを「true」に設定するために使用されます。そのため、目的の場所に自動的にインストールされます。
5) 次に、以下のコマンドを実行して、PHP コード スニファーをインストールします。
"pear install --alldeps pear/PHP_CodeSniffer"
6) 次のコマンドを実行して、PHP Mess Detector をインストールします。
"pear install --alldeps phpmd/PHP_PMD"
このモジュールのインストール中に「無効なパッケージ名/パッケージ ファイル "phpmd/PHP_PMD"」のようなエラーが発生した場合。このエラーを取り除くには、この「pear channel-discover pear.phpmd.org」コマンドを使用する必要があります。このコマンドの後、上記のコマンドを再度実行して、Mess 検出器をインストールできます。
7) 次のコマンドを実行して、PHP Depend をインストールします。
"pear install --alldeps pdepend/PHP_Depend"
8) 次のコマンドを実行して、PHP Copy Paste Detector をインストールします。
"pear install --alldeps phpunit/phpcpd"
9) 次に、コマンドを実行します
"pear config-set auto_discover 0"
これは、自動検出パスを「false」に設定するために使用されます。
10) 次にネット Bean を開き、[ツール] > [オプション] > [PHP] > [PHPCSMD] のパスをたどります。
魔法の解決策はありません。一般的な解決策を提供しようとすると、時間の無駄になる可能性があります。
ボトルネックはどこにありますか?たとえば、スクリプトはプロセッサ/データベース/メモリを集中的に使用しますか?
プロファイリングを実行しましたか?
ファイルを含めるのは遅く、それらを要求するのはさらに遅くなります。すべてのクラスを含めるために __autoload を使用すると、合計されます。例えば。
コードの明快さを犠牲にするのであれば、コードの最適化に関して賢くなりすぎないように、私は常に少し警戒しています。コードを高速化するためにコードをわかりにくくする必要がある場合、コードを微調整して時間を無駄にするよりも、ハードウェアをアップグレードする方が安上がりではないでしょうか? 結局のところ、プロセッサ サイクルはプログラマ サイクルよりも安価です。
私が思いつくものは...
ループ不変条件は、常に監視するのに適しています。
特にエラーを記録する場合は、E_STRICT および E_NOTICE に準拠したコードを記述します。
@ 演算子は避けてください。
必須およびインクルードの絶対パス。
可能な限り、正規表現の代わりに strpos、str_replace などを使用してください。
次に、機能する可能性のある他の方法がたくさんありますが、おそらくあまりメリットはありません.
パフォーマンスの問題を見るときはいつでも、ページの実行にかかる時間を計ってから、最も遅いページを調べるのが最善だと思います。これらの実際のメトリックを取得すると、遅いSQLクエリを修正するか、コードを少し厳しくすることで、最も遅いメトリックのパフォーマンスを桁違いに向上させることができます。
もちろん、これには新しいハードウェアや特別なソフトウェアは必要ありません。既存のコードを批判するだけです。
とは言うものの、これは非常に長い間しか機能しません...ハードウェアの限界に達するのに十分なトラフィックを実際に取得している場合、および/または本質的に遅くて本当に必要なコードがある場合は、他の可能性。
Rasmus Lerdorfは、FrOSCon'08での最近のプレゼンテーション「SimpleisHard」でいくつかの良いヒントを提供しました。バイトコードキャッシュを使用している場合(実際に使用する必要がある場合)、パスミスを含めると非常に問題が発生するため、require/require_onceを最適化します。
xhprof のようなプロファイリング ツールを使用して、コードのどの部分を最適化できるかを確認できます。
私は大規模なレポート システムを担当しており、そのような最も遅いレポートを追跡しています。レポートの開始時にデータベースに一意のキーを発行し、レポートが終了すると、所要時間を判断できます。データベースを使用しているのは、ページのタイムアウトを検出できるためです (これは、私が望むよりもはるかに多く発生します)。
プロファイリングや適切なリソース割り当ての決定 (キャッシングなど) など、他のいくつかのアドバイスを最初に実行してください。
また、データベースなどの外部リソースのパフォーマンスも考慮してください。MySQL では、たとえばスロー クエリ ログを確認できます。さらに、データベースを設計していないことを確認してください。実際のデータに対してクエリを最適化すると (再び MySQLの場合)、大きな代償を払うことができます。