ホームページ  >  記事  >  バックエンド開発  >  マスターしなければならない 9 つの実践的な PHP 関数と特徴

マスターしなければならない 9 つの実践的な PHP 関数と特徴

WBOY
WBOYオリジナル
2016-07-25 08:46:50929ブラウズ
この記事は Tuosheng Technology によって公開されています。私の WeChat toceansoft をフォローしてください

PHP を長年使用している場合でも、今まで知らなかった機能や機能に遭遇することがあります。それらの中には、非常に便利ですが、十分に活用されていないものもあります。誰もがマニュアルや機能リファレンスのページを最初から最後まで読むわけではありません。
1、任意の数のパラメータを持つ関数
PHP ではオプションのパラメータを持つ関数を定義できることはすでにご存知かもしれません。ただし、任意の数の関数引数を完全に許可するメソッドもあります。以下はオプションのパラメーターの例です:
// 2 つのオプションの引数を持つ関数
function foo($arg1 = ”, $arg2 = ”) {
echo “arg1: $arg1n”;
echo "arg2: $arg2n";
}
foo('hello','world');
/* プリント:
引数1: こんにちは
引数2: ワールド
*/
foo();
/* プリント:
引数1:
引数2:
*/
次に、任意の数の引数を受け入れる関数を作成する方法を見てみましょう。今回は func_get_args() 関数を使用する必要があります:
// はい、引数リストは空でも構いません
function foo() {
// 渡されたすべての引数の配列を返します
$args = func_get_args();
foreach ($args as $k => $v) {
echo “arg”.($k+1).”: $vn”;
}
}
foo();
/* 何も出力しません */
foo(‘hello’);
/* プリント
引数1: こんにちは
*/
foo('hello', 'world', 'again');
/* プリント
引数1: こんにちは
引数2: ワールド
引数3: またまた
*/
2、Glob() を使用してファイルを検索します
多くの PHP 関数には、長くてわかりやすい名前が付けられています。ただし、何度も使用して慣れていない限り、glob() 関数で何ができるかを理解するのは難しい場合があります。これは、scandir() 関数のより強力なバージョンと考えてください。パターンに基づいてファイルを検索できます。
//すべてのphpファイルを取得します
$files = glob(‘*.php’);
print_r($files);
/* 出力は次のようになります:
配列
(
[0] => phptest.php
[1] =>pi.php
[2] => post_output.php
[3] =>test.php
)
*/
次のように複数のファイルを取得できます:
// すべての php ファイルと txt ファイルを取得します
$files = glob(‘*.{php,txt}’, GLOB_BRACE);
print_r($files);
/* 出力は次のようになります:
配列
(
[0] => phptest.php
[1] =>pi.php
[2] => post_output.php
[3] =>test.php
[4] => log.txt
[5] =>テスト.txt
)
*/
これらのファイルは、クエリ条件に応じて実際にパスを返す可能性があることに注意してください:
$files = glob('../images/a*.jpg');
print_r($files); /* 出力は次のようになります:
配列
(
[0] => ../images/apple.jpg
[1] => ../images/art.jpg
)
*/
各ファイルのフルパスを取得したい場合は、realpath() 関数を呼び出すことができます:
$files = glob('../images/a*.jpg');
// が適用されます各配列要素への関数
$files = array_map(‘realpath’,$files);
print_r($files);
/* 出力は次のようになります:
配列
(
[0] => C:wampwwwimagesapple.jpg
[1] => C:wampwwwimagesart.jpg
)
*/
3、メモリ使用量情報
スクリプトのメモリ使用量を検出することで、コードの最適化に役立ちます。 PHP は、ガベージ コレクターと非常に高度なメモリ マネージャーを提供します。スクリプトの実行中に使用されるメモリの量は増減する可能性があります。現在のメモリ使用量を取得するには、memory_get_usage() 関数を使用できます。任意の時点でメモリ使用量を最大にする必要がある場合は、memory_limit() 関数を使用できます。
echo「初期値: “.memory_get_usage().” バイト n」;
/* プリント
初期値: 361400バイト
*/
// メモリを使い切ってみましょう
for ($i = 0; $i $array []= md5($i);
}
// 配列の半分を削除しましょう
for ($i = 0; $i unset($array[$i]);
}
echo “最終: “.memory_get_usage().” bytes n”;
/* プリント
最終: 885912 バイト
*/
echo “ピーク: “.memory_get_peak_usage().” bytes n”;
/* プリント
ピーク: 13687072 バイト
*/
4、CPU 使用率情報
このためには、getrusage() 関数を使用する必要があります。この機能は Windows プラットフォームでは利用できないことに注意してください。
print_r(getrusage());
/* プリント
配列
(
[ru_oublock] => 0
[ru_inblock] => 0
[ru_msgsnd] => 2
[ru_msgrcv] => 3
[ru_maxrss] => 12692
[ru_ixrss] => 764
[ru_idrss] => 3864
[ru_minflt] =>94
[ru_majflt] => 0
[ru_nsignals] => 1
[ru_nvcsw] => 67
[ru_nivcsw] => 4
[ru_nswap] => 0
[ru_utime.tv_usec] => 0
[ru_utime.tv_sec] => [ru_stime.tv_usec] => 6269
[ru_stime.tv_sec] => )

*/
すでにシステム管理者権限を持っていない限り、これは少し不思議に思えるかもしれません。各値の説明は次のとおりです (これらを覚える必要はありません):
ru_oublock: 出力操作をブロックします
ru_inblock: 入力操作をブロックします
ru_msgsnd: 送信されたメッセージ
ru_msgrcv: 受信したメッセージ
ru_maxrss: 常駐セットの最大サイズ
ru_ixrss: 統合共有メモリサイズ
ru_idrss: 整数の非共有データサイズ
ru_minflt: ページの再利用
ru_majflt: ページフォールト
ru_nsignals: 受信したシグナル
ru_nvcsw: 自発的なコンテキスト切り替え
ru_nivcsw: 非自発的なコンテキスト切り替え
ru_nswap: スワップ
ru_utime.tv_usec: ユーザーの使用時間 (マイクロ秒)
ru_utime.tv_sec: ユーザーの使用時間 (秒)
ru_stime.tv_usec: 使用されたシステム時間 (マイクロ秒)
ru_stime.tv_sec: 使用されたシステム時間 (秒)

スクリプトが消費する CPU パワーの量を知るには、「ユーザー時間」パラメーターと「システム時間」パラメーターの値を確認する必要があります。デフォルトでは、秒とマイクロ秒の部分が別々に提供されます。 100 万マイクロ秒で除算し、秒パラメータ値を追加すると、合計秒数を 10 進数形式で取得できます。例を見てみましょう:
// 3 秒間スリープします (非ビジー)
sleep(3);

$data = getrusage();
echo "ユーザー時間: ".
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
echo "システム時間: ".
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000);

/* プリント
ユーザー時間: 0.011552
システム時間: 0
*/

スクリプトの実行には約 3 秒かかりましたが、CPU 使用率は非常に低かったです。スリープ実行中、スクリプトは実際には CPU リソースを消費しないためです。ディスク操作の待機など、時間はかかるものの CPU 時間を消費しないタスクは他にもたくさんあります。ご覧のとおり、CPU 使用率と実際の実行時間の長さは常に同じではありません。以下に例を示します:
// 1,000 万回ループします (ビジー)
for($i=0;$i
}
$data = getrusage();
echo "ユーザー時間: ".
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
echo "システム時間: ".
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000);

/* プリント
ユーザー時間: 1.424592
システム時間: 0.004204
*/

これには約 1.4 秒の CPU 時間がかかりましたが、システム コールがなかったため、ほとんどすべてがユーザー時間でした。システム時間は、プログラムのシステム コールの実行に費やされる CPU オーバーヘッドです。以下に例を示します:
$start = microtime(true);
// マイクロタイムを約 3 秒間呼び出し続けます
while(microtime(true) – $start
}
$data = getrusage();
echo "ユーザー時間: ".
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
echo "システム時間: ".
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000);

/* プリント
ユーザー時間: 1.088171
システム時間: 1.675315
*/

現在、かなりのシステム時間が消費されています。これは、スクリプトが microtime() 関数を複数回呼び出すため、必要な時間を取得するためにオペレーティング システムへのリクエストが必要になるためです。実行時間の合計が 3 秒未満であることにも気づくかもしれません。これは、サーバー上に同時に他のプロセスが存在し、スクリプトが 3 秒間ずっと CPU を 100% 使用していない可能性があるためです。
5
、魔法定数
PHP は、現在の行番号 (__LINE__)、ファイル パス (__FILE__)、ディレクトリ パス (__DIR__)、関数名 (__FUNCTION__)、クラス名 (__CLASS__)、メソッド名 (__METHOD__)、名前空間 (__NAMESPACE__) の取得などの便利な関数を提供します。魔法の定数。この記事ではすべてを説明しませんが、いくつかの使用例を紹介します。他のスクリプト ファイルをインクルードする場合は、__FILE__ 定数を使用します (または、PHP5.3 の新しい __DIR__ 定数を使用します):
// これは、ロードされたスクリプトのパスに対する相対パスです
// 異なるディレクトリからスクリプトを実行すると問題が発生する可能性があります
require_once(‘config/database.php’);
// これは常にこのファイルのパスに対する相対パスです
// どこからインクルードされたかは関係ありません
require_once(dirname(__FILE__) . ‘/config/database.php’);
__LINE__ を使用するとデバッグが簡単になります。特定の行番号を追跡できます。
// いくつかのコード
//…
my_debug(“何らかのデバッグメッセージ”,__LINE__);
/* プリント
4行目: デバッグメッセージ
*/
// さらにコード
// …
my_debug(“別のデバッグ メッセージ”, __LINE__);
/* プリント
11行目: 別のデバッグメッセージ
*/
function my_debug($msg, $line) {
echo “行 $line: $msgn”;
}
6、一意の識別子の生成
一部のシナリオでは、一意の文字列を生成する必要がある場合があります。この目的を正確に意図したものではないにもかかわらず、多くの人が md5() 関数を使用しているのを見かけます:
// 一意の文字列を生成します
echo md5(time() . mt_rand(1,1000000));
実際には、これに使用するための uniqid() という名前の PHP 関数があります。
// 一意の文字列を生成します
エコーuniqid();
/* プリント
4bd67c947233e
*/
// 別の一意の文字列を生成します
エコーuniqid();
/* プリント
4bd67c9472340
*/
文字列は一意ですが、最初の数文字が似ていることに気づくかもしれません。これは、生成された文字列がサーバー時刻を基準にしているためです。しかし、実際には、新しく生成された各 ID がアルファベット順に並べられるため、ソートが簡単になるという親切な側面もあります。重複の可能性を減らすために、接頭辞を渡すか、エントロピーを増やす 2 番目の引数を渡すことができます:
// with prefix
echo uniqid('foo_');
/* プリント
foo_4bd67d6cd8b8f
*/
// エントロピーが増加
echo uniqid(”,true);
/* プリント
4bd67d6cd8b926.12135106
*/
//両方
echo uniqid('bar_',true);
/* プリント
bar_4bd67da367b650.43684647
*/
この関数は md5() よりも短い文字列を生成するため、スペースを節約できます。
7、シリアル化
複雑な変数をデータベースまたはテキスト ファイルに保存する必要がある状況に遭遇したことがありますか?文字列をフォーマットして配列またはオブジェクトに変換する適切な方法がわからないかもしれません。PHP にはこの機能が用意されています。変数をシリアル化するには 2 つの一般的な方法があります。以下は、serialize() 関数と unserialize() 関数を使用した例です:
// 複雑な配列
$myvar = 配列(
「こんにちは」
42、
配列(1,'two'),
「リンゴ」
);
// 文字列に変換します
$string = Serialize($myvar);
echo $string;
/* プリント
a:4:{i:0;s:5:「こんにちは」;i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3: "2";}i:3;s:5:"リンゴ";}
*/
// 元の変数を再現できます
$newvar = unserialize($string);
print_r($newvar);
/* プリント
配列
(
[0] => こんにちは
[1] => 42
[2] => 配列
(
[0] => 1
[1] =>2
)
[3] => リンゴ
)
*/
これはネイティブの PHP シリアル化メソッドです。しかし、近年の JSON の人気により、PHP5.2 では JSON 形式のサポートが追加されました。これで、json_encode() 関数と json_decode() 関数を使用できるようになりました:
// 複雑な配列
$myvar = 配列(
「こんにちは」
42、
配列(1,'two'),
「リンゴ」
);
// 文字列に変換します
$string = json_encode($myvar);
echo $string;
/* プリント
["こんにちは",42,[1,"二"],"リンゴ"]
*/
// 元の変数を再現できます
$newvar = json_decode($string);
print_r($newvar);
/* プリント
配列
(
[0] => こんにちは
[1] => 42
[2] => 配列
(
[0] => 1
[1] =>2
)
[3] => リンゴ
)
*/
これはより効率的であり、特に JavaScript などの他の多くの言語との互換性があります。ただし、複雑なオブジェクトの場合、一部の情報が失われる可能性があります。
8、圧縮文字列
圧縮について話すとき、私たちは通常、ZIP 圧縮などのファイル圧縮を思い浮かべます。 PHP でも文字列圧縮が可能ですが、圧縮ファイルは必要ありません。次の例では、gzcompress() 関数と gzuncompress() 関数を使用します。
$string =
「Lorem ipsum dolor sit amet, consectetur
」 アディピシングエリート、Nunc ut elit id mi ultrices
ヌラ・ファシリシ、
サピエン・ヴェル・フェジアト前庭、ヌラ・デュイ・プレティウム・オルチ、
非究極的エリート、ロレム・イプサム・ドール
。 座って、エリートを集めてください。 プレティウム・ウラムコーパー・ウルナ・キス・イアキュリス
sed turpis Tempor luctus Curabitur sed nibh eu elit
モリス・コングー、Praesent ipsum diam、consectetur vitae
オルナレ、アリカム、ヌンクで。 Tellus posuere adipiscing、Sed non mi metus、ラキニア
オーグー、セド・マグナ・ニシ、オルナーレ・イン・モリス、モリス
レオ・コング・モリスのジュストでセド・ヌンク。 ネケ・エゲット・メトゥス・ヘンドレリット・スセレリスクのヌラム
ユー・ノン・エニム
id euismod urna sodales. ";

$compressed = gzcompress($string);
echo "元のサイズ: ".strlen($string)."n";
/* プリント
元のサイズ: 800
*/

echo "圧縮サイズ: ".strlen($compressed)."n";
/* プリント
圧縮サイズ: 418
*/

//取り戻します
$original = gzuncompress($compressed);
この操作の圧縮率は約 50% に達する可能性があります。追加関数 gzencode() および gzdecode() は、異なる圧縮アルゴリズムを使用して同様の結果を達成できます。
9
、登録シャットダウン関数 register_shutdown_function() と呼ばれる関数があり、これを使用すると、特定のスクリプトの実行が完了する前に、指定されたコードを実行できます。スクリプトの実行が終了する前に、実行時間などのベースライン統計を取得する必要があるとします。
// 開始時刻を取得します
$start_time = microtime(true);
// いくつかのことを行います
// …
// スクリプトにかかった時間を表示します
echo "実行にかかった時間: ".
(microtime(true) – $start_time).
"秒。";

これは簡単なことのように思えるかもしれませんが、スクリプトの実行の最後に関連するコードを追加するだけです。ただし、exit() 関数を呼び出した場合、コードは実行されません。さらに、致命的なエラーが発生した場合、またはスクリプトがユーザーによって予期せず終了された場合、スクリプトは再度実行されなくなる可能性があります。 register_shutdown_function() 関数を使用すると、スクリプトの実行が停止するかどうかに関係なく、コードは実行を続けます:
$start_time = microtime(true);
register_shutdown_function(‘my_shutdown’);
// 何かを実行します
// …
関数 my_shutdown() {
global $start_time;
echo “実行にかかった時間: “.
(microtime(true) – $start_time).
「秒。」;
}


私の記事が気に入ったら、私のWeChat toceansoftをフォローしてください

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。