PHPの動作効率を向上させる方法
[転送] PHP の利点の 1 つは非常に高速であることです。一般的な Web アプリケーションには十分であると言えます。ただし、サイトのトラフィックが多い、帯域幅が狭い、またはその他の要因によりサーバーのパフォーマンスのボトルネックが発生する場合は、PHP の速度をさらに向上させる他の方法を考える必要がある場合があります。
1.コードの最適化
(1) i=i+1 を i+=1 に置き換えます。 C/C++ の習慣に準拠しており、非常に効率的です。
(2)可能な限りPHP内部関数を使用する。自分で関数を書く前に、関連する関数がないかマニュアルを詳しく調べてください。そうでないと、無駄な作業になります。
(3) シングルクォートで囲まれた文字列を使用できる場合は、シングルクォートで囲まれた文字列を使用するようにしてください。一重引用符で囲まれた文字列は、二重引用符で囲まれた文字列よりも効率的です。
(4) 配列を走査するには、while の代わりに foreach を使用します。配列を走査するとき、foreach の効率は while ループの効率よりも大幅に高く、reset 関数を呼び出す必要はありません。 2 つの走査方法は次のとおりです:
手順1:
リセット ($arr);??
while (list($key, $value) = each ($arr)) {??
エコー "キー: $key; 値: $value
n";??
}
? プログラム 2:
foreach ($arr as $key => $value) {??
エコー "キー: $key; 値: $value
n";??
}
? 2. ページを圧縮します
HTTP1.1 プロトコルは、ページ圧縮送信をサポートしています。これは、サーバーがページを圧縮してクライアントに送信し、クライアント上でページを解凍してクライアントに表示することを意味します。サーバー側の送信には 2 種類あります 1 つは、送信時にページが事前に圧縮されているため、圧縮されたページをクライアントに送信するだけで済みます。この方法は、静的な Web ページが多数存在する状況に適していますが、ほとんどのサイトでは動的ページが多数存在します。この方法 クライアントに送信されるページの多くは実際には存在しないため、この方法は適していません。そのため、生成された各動的ページは、送信する前にパッケージ化して圧縮する必要があります。クライアントに。 縮む。 PHP バージョン 4.0.4 以降では、php.ini ファイルに設定行「output_handler =」を追加できます。 ob_gzhandler" を使用すると、動的に生成された各ページがクライアントに送信される前に圧縮されますが、PHP 公式サイトの指示によると、このパラメータは "zlib.output_compression= 「on」パラメータは、PHP の動作異常を引き起こしやすいため、同時に使用されます。また、PHP プログラムの動的に生成されたページのみを圧縮できますが、多数の静的ページに対しては機能しません。ただし、特に画像ファイル。 mod_gzip モジュールは、静的ページをクライアントに渡す前に圧縮する機能を Apahe に提供します。その圧縮率は最大 10 に達します。通常の状況では、圧縮率は 10 に達します。 3、つまり、Web サイトの通信速度が 3 倍以上に向上しました。 mod_gzip を使用するには、それに応じて Apache を設定する必要があります。 httpd.conf ファイルにいくつかのパラメータを追加する必要があります。 番号:
mod_gzip_on はい (モジュールが有効かどうか)
mod_gzip_minimum_file_size 1002 (最小圧縮ファイルサイズ)
mod_gzip_maximum_file_size 0 (圧縮ファイルの最大サイズ、0 は制限なしを意味します)
mod_gzip_maximum_inmem_size 60000 (最大占有メモリ)
mod_gzip_item_include ファイル "..gif102SINA>DOUBLE_QUOTATION (gif で終わるファイルは圧縮して送信する必要があります)
mod_gzip_item_include ファイル「.txt102SINA>DOUBLE_QUOTATION
」mod_gzip_item_include ファイル「.html102SINA>DOUBLE_QUOTATION
」mod_gzip_item_exclude ファイル「.css102SINA>DOUBLE_QUOTATION
」3. ファイルのキャッシュ
このメソッドは通常、PHP や PERL などの CGI プログラムで使用されます。これらのプログラムには、ユーザーのリクエストを受け取った後、すぐに結果をユーザーに返さないという共通の特徴があるためです。 インタプリタによる解釈と実行後、実行結果がクライアントに返されますが、これには通常データベースへのアクセスが伴います。これにより、2 人のユーザーが同じページにアクセスすると、システムは 2 つのリクエストを別々に処理します。 操作は実行されますが、実際には 2 つの操作がまったく同じである可能性があり、目に見えないほどシステムの負荷が増加します。したがって、通常の解決策は、ユーザーが初めてページにアクセスしたときに、システム メモリ内のスペースを開くことです。 実行結果はメモリに保存され、ユーザーが再度ページにアクセスすると、システムはページを再解釈して実行せずにメモリから直接呼び出します。このメモリ空間はキャッシュと呼ばれます。現在人気のキャッシュチューブ 管理者は Zend Technologies の Zend Cache です。
4.システム外部コマンドの実行
PHP は、サーバーサイドのスクリプト言語として、単純または複雑な動的 Web ページの作成などのタスクを完全に実行できます。ただし、常にそうとは限りません。場合によっては、特定の機能を実装するために、半分の労力で 2 倍の結果を得ることができるように、オペレーティング システムの外部プログラム (またはコマンド) に頼らなければなりません。
PHP で外部コマンドを呼び出すには、以下に紹介する 3 つの方法を使用できます。
5. PHP が提供する特別な関数を使用するPHP は、外部コマンドを実行するための 3 つの特殊な関数、system()、exec()、および passthru() を提供します。
システム()プロトタイプ: 文字列 システム (文字列コマンド [, int return_var])
system() 関数は他の言語の関数と似ており、指定されたコマンドを実行し、結果を出力して返します。 2 番目のパラメーターはオプションであり、コマンドの実行後にステータス コードを取得するために使用されます。例:
system("/usr/local/bin/webalizer/webalizer");exec()
プロトタイプ: string exec (文字列コマンド [, 文字列配列 [, int return_var]])exec() 関数と System() も同様で、指定されたコマンドを実行しますが、結果は出力せず、結果の最後の行を返します。コマンド結果の最後の行のみを返しますが、2 番目のパラメーター配列を使用して完全な結果を取得できます。 結果全体が 1 行ずつ配列の末尾に追加されます。したがって、配列が空でない場合は、呼び出す前に unset() を使用して配列をクリアするのが最善です。第二引数を指定した場合のみ、 コマンド実行時のステータスコードを取得できるのは第3パラメータのみです。
例:exec("/bin/ls -l");
exec("/bin/ls -l", $res);
exec("/bin/ls -l", $res, $rc);
パススルー()プロトタイプ: void パススルー (文字列コマンド [, int return_var])
passthru() はコマンドを呼び出すだけで、結果は返しません。 コマンドの実行結果はそのまま標準出力装置に出力されます。したがって、pbmplus (Unix で画像を処理するツール) を呼び出すために passthru() 関数がよく使用されます。 RAW 画像のバイナリ ストリームを出力するプログラム。コマンド実行時のステータスコードも取得できます。例:
header("コンテンツタイプ: 画像/gif");パススルー("./ppmtogif ハント.ppm");
6. Popen() 関数を使用してプロセスを開きます上記のメソッドは単にコマンドを実行するだけで、コマンドと対話することはできません。ただし、コマンドに何かを入力する必要がある場合があります。たとえば、Linux システム ユーザーを追加する場合、su を呼び出して現在のユーザーを root に変更する必要があり、su コマンドはコマンド ラインに root パスワードを入力する必要があります。この場合、明らかに上記の方法を使用することはできません。
Popen() 関数は、プロセス パイプを開いて指定されたコマンドを実行し、ファイル ハンドルを返します。ファイルハンドルが返されるので、読み書きが可能です。 PHP3ではこのような文章の場合 PHP4 以降、ハンドルは書き込みまたは読み取りの 1 つの操作モードのみを実行できるようになり、読み取りと書き込みを同時に行うことができます。ハンドルが 1 つのモード (読み取りまたは書き込み) でオープンされていない限り、pclose() を呼び出す必要があります。 それを閉じる機能。例 1:
$fp=popen("/bin/ls -l"、"r");例 2:
/* PHP でシステム ユーザーを追加する方法次は、james という名前のユーザーを追加するルーチンです。
root パスワードは非常に優れています。あくまで参考として
*/
$sucommand = "su --ログインルート --コマンド";
$useradd = "useradd ";
$rootpasswd = "非常に良い"$user = "ジェームズ"
$user_add = sprintf("%s "%s %s"",$sucommand,$useradd,$user);
$fp = @popen($user_add,"w");
@fputs($fp,$rootpasswd)
@pclose($fp)
?
?
?
適切なプログラミング スタイルを開発する
多くの場合、PHP の最も価値のある機能は、その緩い構文であるという最大の弱点でもあります。 PHP が広く使用されているのは、経験の浅い Web 開発者の多くが計画、一貫性、ドキュメント化についてあまり心配することなく強力なアプリケーションを作成できるためです。残念ながら、まさにその理由は、 上記の特性により、多くの PHP ソース コードは肥大化して読みにくく、さらには保守が不可能になります。コードの保守性を決定する重要な要素は、コードの形式とコメントです。プロジェクトのすべてのコードは一貫した方法で編成する必要があります 織ります。以下では、PHP プログラムで適切なコーディング スタイルを開発する方法について説明します。
?
7. インデント
?
開発者が記述するすべてのコードは、完全にインデントされた方法で記述する必要があります。これは、コードの可読性を向上させるための最も基本的な対策です。コードにコメントを付けない場合でも、コードを他の人が理解しやすくするためにインデントは非常に役立ちます。
?
8. コメントを追加
?
プログラミング時にコメントを追加することは良い習慣です。PHP では、コメントをページ コードに追加できます。コメントの具体的な方法は、C 言語のコメント構文と同じです。 「/*」と「*/」を使用して段落をコメントアウトできます。ダブルスラッシュ「//」はコメント文字として使用できます。
?
9. 制御構造
?
これは個人の好みに大きく依存します。分岐ステートメントのない制御構造コードがまだ多くあり、その結果、可読性が非常に低くなります。分岐のない IF ステートメントを使用すると、可読性が悪化するだけでなく、他の人がプログラムを変更したときに、多くのエラーが発生します。バグ。以下の例を参照してください:
?
悪い例:
?
if ($a == 1) echo 'A は 1 に等しかった';
?
識別するのは非常に困難です。それはうまくいきますが、あなた以外には誰もそれを評価しません。 改善された例:
?
if ($a == 1)
エコー 'A でした 1 に等しい
?
?
これで、少なくともこのコードは読み取れるようになりましたが、まだ保守性は高くありません。 $a==1 のときに追加のイベントを発生させたい場合、または分岐を追加する必要がある場合はどうすればよいでしょうか? 後のプログラマーが中括弧や else キーワードを追加するのを忘れた場合、プログラムにバグが発生します。
?
完璧な例
?
if (($a == 1) && ($b==2)) {
エコー 'A でした 1 に等しい'; // 他のコードを追加するのは簡単です
} elseif (($a == 1) && ($b==3)) { //その他の操作
}
?
?
if と elseif の後のスペースに注意してください。これにより、このステートメントが関数呼び出しと区別されます。また、elseif の実行セクションにはステートメントがなく、コメントのみであるため、一見冗長に見えますが、プログラムのプログラマーは、非常に便利なヒントを提供し、機能の追加に非常に役立ちました。
?
10. Include を使用して機能モジュール化を実装します
?
よく使う関数を PHP ファイルに保存しておくと、その関数を他の PHP ページで使用したい場合、その関数を呼び出す PHP ファイルにその関数を含めることができます。関数を含めます。具体的な構文は次のとおりです:
?
include($FileName);
?
使用する際の注意事項
?
1. 自己包含は避けるべきです。つまり、File1 には File1 が含まれます。複数のファイルに include ステートメントがある場合は、File1 に File2、File2 が含まれるなど、間接的な自己包含、つまり循環包含は避けるべきです。 File3 には File3 が含まれ、File3 には File1 が含まれます。
?
2. 含まれるスクリプト言語のタイプは、PHP 言語タイプまたはスクリプト ステートメント セグメントである必要があります。
???? http://www.zxbc.cn/html/phpjq/0908342313525_3.html