PHPを長年使っていても、今まで知らなかった関数や関数に遭遇することがあります。それらの中には、非常に便利ですが、十分に活用されていないものもあります。誰もがマニュアルや機能リファレンスを最初から最後まで読むわけではありません。
1. 任意の数のパラメータを持つ関数PHP ではオプションのパラメーターを使用して関数を定義できることはすでにご存知かもしれません。ただし、任意の数の関数引数を完全に許可するメソッドもあります。オプションのパラメーターの例を次に示します:
// オプションの引数を 2 つ持つ関数
関数 foo($arg1 = '', $arg2 = '') {
echo "arg1: $arg1n";
echo "arg2: $arg2n";
}
foo('hello','world');
/* プリント:
arg1: こんにちは
引数2:ワールド
*/
ふー();
/* プリント:
引数1:
引数2:
*/
次に、任意の数の引数を受け入れる関数を作成する方法を見てみましょう。今回は func_get_args() 関数を使用する必要があります:
// はい、引数リストは空でも構いません
関数 foo() {
// 渡されたすべての引数の配列を返します
$args = func_get_args();
foreach ($args as $k => $v) {
echo "arg".($k+1).": $vn";
}
}
ふー();
/* 何も出力しません */
foo('こんにちは');
/* プリント
arg1: こんにちは
*/
foo('hello', 'world', 'again');
/* プリント
arg1: こんにちは
引数2:ワールド
arg3: 再度
*/
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] => test.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()." bytes 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] => 0
[ru_stime.tv_usec] => 6269
[ru_stime.tv_sec] => 0
)
*/
システム管理者権限をすでに持っていない限り、これは少し不思議に思えるかもしれません。各値の具体的な説明は次のとおりです (これらを暗記する必要はありません):
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 秒間スリープします (非ビジー)
睡眠(3);
$data = getrusage();
「ユーザー時間: 」をエコーします。
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
「システム時間:」をエコーします。
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000);
/* プリント
ユーザー時間: 0.011552
システム時間: 0
*/
スクリプトの実行には約 3 秒かかりましたが、CPU 使用率は非常に低かったです。スリープ実行中、スクリプトは実際には CPU リソースを消費しないためです。ディスク操作の待機など、時間はかかるものの CPU 時間を消費しないタスクは他にもたくさんあります。ご覧のとおり、CPU 使用率と実際の実行時間の長さは常に同じではありません。以下に例を示します:
// 1000万回ループ(ビジー)
for($i=0;$i
}
$data = getrusage();
「ユーザー時間: 」をエコーします。
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
「システム時間:」をエコーします。
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000);
/* プリント
ユーザー時間: 1.424592
システム時間: 0.004204
*/
これには約 1.4 秒の CPU 時間がかかりましたが、システムコールがないため、ほとんどすべてがユーザー時間でした。システム時間は、プログラムのシステム コールの実行に費やされる CPU オーバーヘッドです。以下に例を示します:
$start = microtime(true);
// microtimeを約3秒間呼び出し続けます
while(microtime(true) - $start
}
$data = getrusage();
「ユーザー時間: 」をエコーします。
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
「システム時間:」をエコーします。
($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行目: 別のデバッグメッセージ
*/
関数 my_debug($msg, $line) {
echo "Line $line: $msgn";
}
6.一意の識別子を生成します
シナリオによっては、一意の文字列を生成する必要がある場合があります。正確にはこの目的を意図したものではないにもかかわらず、多くの人が md5() 関数を使用しているのを見かけます。
// 一意の文字列を生成します
echo md5(time() . mt_rand(1,1000000));
実際には、これに使用することを目的とした uniqid() という名前の PHP 関数があります。
// 一意の文字列を生成しますecho uniqid();
/* プリント
4bd67c947233e
*/
// 別の一意の文字列を生成します
echo uniqid();
/* プリント
4bd67c9472340
*/
文字列は一意ですが、最初の数文字は似ていることに気づくかもしれません。これは、生成された文字列がサーバー時刻を基準にしているためです。しかし、実際には、新しく生成された各 ID がアルファベット順に並べられるため、ソートが簡単になるという親切な側面もあります。重複の可能性を減らすために、接頭辞または 2 番目の引数を渡してエントロピーを増やすことができます:
// プレフィックス付き
echo uniqid('foo_');
/* プリント
foo_4bd67d6cd8b8f
*/
// より多くのエントロピーを使用して
echo uniqid('',true);
/* プリント
4bd67d6cd8b926.12135106
*/
// 両方
echo uniqid('bar_',true);
/* プリント
bar_4bd67da367b650.43684647
*/
この関数は md5() よりも短い文字列を生成し、スペースを節約します。
7.連載
複雑な変数をデータベースまたはテキスト ファイルに保存する必要がある状況に遭遇したことがありますか? 文字列をフォーマットして PHP が用意した配列またはオブジェクトに変換する適切な方法が見つからなかった可能性があります。この機能はあなたのためのものです。変数をシリアル化するには 2 つの一般的な方法があります。以下は、serialize() 関数と unserialize() 関数を使用した例です:
// 複雑な配列
$myvar = array(
「こんにちは」
42、
array(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 = array(
「こんにちは」
42、
array(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アディピシシング、Praesent pulvinar、
。
Sapien vel feugeat前庭、nulla dui pretium orci、non ultricies elit lacus quis ante Lorem ipsum dolor
。
Sit amet, consectetur adipiscing elit。
Pretium ullamcorper urna quis iaculis。
Sed turpis Tempor luctus Curabitur sed nibh eu elit。
Mollis congue. Praesent ipsum diam, consectetur vitaeOrnare a, aliquam a nunc、In id magna pellentesque
。
tellus posuere adipiscing. Sed non mi metus, at laciniaセド・マグナ・ニシ、オルナーレ・イン・モリス・イン、モリス
。
sed nunc. leo congue mollisのjustoでエティアム。Nullam in neque eget metus hendrerit scelerisque
eu non enim. Ut Malesuada lacus eu nulla bibendum
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() {
グローバル $start_time;
echo "実行にかかった: ".
(microtime(true) - $start_time).
「秒。」;
}
http://www.bkjia.com/PHPjc/371403.html