ホームページ  >  記事  >  バックエンド開発  >  PHP実行速度最適化テクニックまとめ_PHPチュートリアル

PHP実行速度最適化テクニックまとめ_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:53:44744ブラウズ

1. file、fopen、feof、fgets などの一連のメソッドの代わりに file_get_contents を使用できる場合は、より効率的な file_get_contents を使用してください。ただし、URL ファイルを開くときは、file_get_contents の PHP バージョンの問題に注意してください。

2. PHP のファイル操作効率は低くありませんが、可能な限り SELECT SQL ステートメントを最適化します。 INSERT 操作と UPDATE 操作をできるだけ少なくします (UPDATE で批判されました)。 4. PHP の内部関数をできるだけ使用します (ただし、PHP に存在しない関数を見つけるのに時間を無駄にしました)。カスタム関数は経験の問題です!);

5. ループ内で変数、特に大きな変数を宣言しないでください (これは PHP だけの問題ではないようです)。多次元配列にはループのネストされた代入を使用しないでください。



7. PHP の内部文字列操作関数を使用できる場合は、正規表現を使用しないでください。代わりに foreach を使用してください。 for ループ;



9. 文字列を引用するには、二重引用符の代わりに単一引用符を使用します。



10。 C/C++ の習慣に準拠しており、非常に効率的です。


11. グローバル変数は使用後に unset() する必要があります。


静的呼び出しメンバーは静的として定義する必要があります (PHP5 のみ)

ヒント: PHP5では静的メンバーという概念が導入されており、PHP4の関数内の静的変数と同じ機能を持ちますが、前者はクラスのメンバーとして使用されます。静的変数は、Ruby のクラス変数に似ています。クラスのすべてのインスタンスは同じ静的変数を共有します。非静的メンバーを静的に呼び出す効率は、静的メンバーを静的に呼び出すよりも 50 ~ 60% 遅くなります。主な理由は、前者は E_STRICT 警告を生成し、内部で変換する必要があるためです。

class foo {
function bar() {
echo 'foobar';
foo }
}
$foo = new foo
// インスタンスウェイ
$foo->bar() ; / / 静的な方法
foo::bar();
?>

クラス定数を使用する (PHP5 のみ)

ヒント: C++ const に似た PHP5 の新しい関数。

クラス定数を使用する利点は次のとおりです:

- コンパイル時間の分析、追加のオーバーヘッドなし

- ハッシュ テーブルが小さいため、内部検索が高速になります

- クラス定数は特定の「名前空間」にのみ存在するため、ハッシュ名は短く変更されます

- コードがよりクリーンになり、デバッグが容易になります



(一時的に) require/include_once を使用しないでください

require/include_once は呼び出されるたびにターゲット ファイルを開きます!

- 絶対パスを使用する場合、PHP 5.2/6.0 ではこの問題は発生しません

- APC キャッシュ システムの新しいバージョンでは、この問題が解決されました

ファイル I/O の増加 => 効率の低下

必要に応じて、次のことができます。ファイルが必要かどうか、含まれているかどうかを自分で確認してください。



意味のない関数を呼び出さないでください

対応する定数がある場合は関数を使用しないでください。

php_uname('s') == PHP_OS;
php_sapi_name() == PHP_SAPI;
あまり使わないですが、効率化は3500%くらい。



最速の Win32 チェック

$is_win = DIRECTORY_SEPARATOR == '\';
?>
- 関数は必要ありません

- Win98/NT/2000/XP/Longhorn/Shorthorn /Whistler...ユニバーサル

- いつでも利用可能



時間の問題 (PHP>5.1.0 のみ)

ソフトウェアの現在時刻をどのようにして知るのですか?シンプルに、「time() time() もう一度、あなたは私に尋ねます...」。

しかし、常に関数を呼び出すことになるため、時間がかかります。

これで、$_SERVER['REQUEST_TIME'] を使用できるようになりました。関数を呼び出す必要はありません。再度保存してください。



PCRE を高速化する

- 保存する必要のない結果については、() を使用せず、常に (?:) を使用します

この方法では、PHP は一致するコンテンツを保存するためにメモリを割り当てる必要がありません。効率は約 15% 向上します。

- 正規表現を使用できる場合は、分析する際にマニュアルの「文字列関数」セクションをよく読んでください。見逃している便利な機能はありますか?

例:

strpbrk()

strncasecmp()

strpos()/strrpos()/stripos()/strripos()



strtrの高速化

変換する必要があるのが単一文字の場合, strtr を実行するには、配列の代わりに文字列を使用します。

$addr = strtr($addr, "abcd", "efgh") // 良い
$addr = strtr($addr, array('a) ' => 'e'、




不必要な置換は行わないでください

置換がない場合でも、str_replace はパラメータにメモリを割り当てます。非常に遅い!解決策:

- 最初に (非常に高速に) strpos を使用して検索し、必要に応じて再度置き換えます

効率:

- 置き換える必要がある場合: 効率はほぼ同等です。その差は約0.1%です。

- 置換が必要ない場合: strpos を 200% 高速に使用します。



邪悪な @ 演算子

@ 演算子を悪用しないでください。 @は単純そうに見えますが、実際には裏側で多くの処理が行われています。 @ を使用する場合と使用しない場合の効率の差は 3 倍です。

特にループ内で @ を使用しないでください。5 つのループのテストでは、最初に error_reporting(0) を使用してエラーをオフにし、ループが完了してからエラーをオンにしても、@ を使用するよりも高速です。 。



strncmp を上手に活用してください

「最初の n 文字」が同じかどうかを比較する必要がある場合は、PCRE ではなく substr/strto lower の代わりに strncmp/strncasecmp を使用し、決して ereg には言及しないでください。 strncmp/strncasecmp が最も効率的です (ただし、それほど高いわけではありません)。



substr_compare は注意して使用してください (PHP5 のみ)

上記の原則に従って、substr_compare は最初とその後の substr よりも高速である必要があります。以下の場合を除き、答えはノーです:


- 大文字と小文字を区別しない比較

- より大きな文字列を比較します





文字列の代わりに定数を使用しないでください

理由:

- ハッシュテーブルを2回クエリする必要があります

- 定数名を小文字に変換する必要があります (2 番目のクエリを実行するとき)

- E_NOTICE 警告を生成します

- 一時的な文字列が作成されます

効率の差: 700%。





forループの条件文にcount/strlen/sizeofを入れないでください

ヒント: 私の個人的なアプローチ

for ($i = 0, $max = count($配列 );$i < $max; ++$i);
?> if ($a == $b) {
$str .= $a;
$str .= $b;
// 長い
if ($a == $b) {
$str .= $a;
$str .= $b;
$str; .= ($a == $b ? $a : $b); どちらが速いと思いますか?

効率の比較:

-最長: 4.27

-長い: 4.43

-短い: 4.76

信じられない?もう一つは次のとおりです:


//original
$d = dir('.');
while (($entry = $d->read()) !== false) {
if ( $entry == '.' || $entry == '..') {
)
scandir('.')
?> どれが速いですか?

効率の比較:

- オリジナル: 3.37

- glob: 6.28

- scandir: 3.42

- OOなしのオリジナル: 3.14

- SPL (PHP5): 3.95

V oiceover:からも見ることができますPHP5 の登場 オブジェクト指向の効率は大幅に向上しており、その効率は純粋な関数の効率とそれほど変わりません。



PHP ファイルへのアクセス効率を向上させる

他の PHP ファイルを含める必要がある場合は、フルパス、または変換が簡単な相対パスを使用します。

include 'file.php'; // 悪いアプローチ
include './file.php'; // 良いアプローチ
include '/path/to/file.php' // 理想的
?> ;


すべてを最大限に活用しましょう

PHP には利用可能な拡張機能と関数が多数あります。関数を実装する前に、PHP にこの関数があるかどうかを確認する必要があります。もっと簡単な実装はありますか?

$filename = "./somepic.gif";
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename)); ($handle);
// より単純な
file_get_contents('./somepic.gif');




引用に関するヒント:

- 複雑な構造を簡素化する

- メモリ使用量を最適化します


$a['b']['c'] = array();
// アクセスごとに 2 つの余分なハッシュ検索が遅くなります
for ($i = 0; $ i <5; ++$i)
$a['b']['c'][$i] = $i
// より高速な参照ベースのアプローチ
$ref =& $a[ 'b' ]['c'];
for ($i = 0; $i < 5; ++$i)
$ref[$i] = $i?>
$a = 'large string';
// メモリを大量に使用するアプローチ
function a($str){
return $str.'something';
// より効率的な解決策
function a(&$str){
$ str .= '何か';
}
?>


================================ =========

参考資料

http://ilia.ws

Ilia の個人 Web サイト、ブログ、彼が参加した開発の一部や出版物などへのリンク。

http://ez.no

eZ コンポーネントの公式ウェブサイト、eZ comp は、効率性を自らの責任として捉えた PHP5 用のオープンソース ユニバーサル ライブラリであり、Ilia も開発に参加しました。

http://phparch.com

php|アーキテクト、優れた php 出版社/トレーニング組織。お金がない場合、または購入できない場合は、オンラインで入手できる古典的な海賊版がたくさんあります。

http://talks.php.net

PHP カンファレンスでのスピーチ集はまだそれほど豊富ではありませんが、内容は一目見ると寝食を忘れてしまうような良いものばかりです。朝眠いときに食べるか、昼食後にしっかり勉強してください。そうしないと、食べることも寝ることも忘れてしまいます。





http://www.bkjia.com/PHPjc/318678.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/318678.html技術記事 1. file、fopen、feof、fgets およびその他の一連のメソッドの代わりに file_get_contents を使用できる場合は、より効率的である file_get_contents を使用するようにしてください。ただし、file_get_con には注意してください...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。