9つのphp関数と特徴を知っておく必要があります
13819 ワード
次は9つのPHPの中で役に立つ機能ですが、使ったことがありますか?1.関数の任意の数のパラメータPHPがデフォルトのパラメータの関数を定義できることを知っているかもしれません.しかし、PHPが完全に任意のパラメータを定義できる関数を知らないかもしれません.次に、デフォルトのパラメータを示す関数の例を示します.
次にfunc_を用いた不定パラメータの関数を見てみましょうget_Args()メソッド:
2. Glob()を使用してファイルを検索すると、多くのPHPの関数には長い自己解釈の関数名がありますが、glob()を見たとき、この関数が何に使われているのか分からないかもしれません.それに慣れていない限り.
この関数はscandir()と同じように、ファイルを検索するために使用できると思います.
パスを追加することもできます.
絶対パスを取得したい場合はrealpath()関数を呼び出すことができます.
3.メモリ使用情報あなたのプログラムのメモリ使用を観察すると、コードをより最適化することができます.
PHPはゴミ回収メカニズムがあり、複雑なメモリ管理メカニズムがあります.スクリプトが使用するメモリの状況を知ることができます.現在のメモリの使用状況を知るにはmemory_を使用します.get_USage()関数は、メモリのピークを使用することを知りたい場合はmemory_を呼び出すことができます.get_peak_USage()関数.
4.CPU使用情報getrusage()関数を使用すると、CPUの使用状況を知ることができます.この機能はWindowsでは使用できません.
この構造はCPUについてよく知らない限り、難解に見えます.以下に説明します.
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:ユーザ状態時間(microseconds)
ru_utime.tv_sec:ユーザ状態時間(seconds)
ru_stime.tv_usec:システムカーネル時間(microseconds)
ru_stime.tv_sec:システムカーネル時間?(seconds)
スクリプトがどれだけCPUを消費しているかを見るには、「ユーザー状態の時間」と「システムカーネル時間」の値を見る必要があります.秒とマイクロ秒の部分はそれぞれ提供されており、マイクロ秒の値を100万で割って秒の値に追加すると、小数部のある秒数が得られます.
sleepはシステム時間を消費しません.次の例を見てみましょう.
これは約14秒のCPU時間を費やし,ほとんどがユーザの時間であり,システム呼び出しがないためである.
システム時間とは、CPUがシステム呼び出し上でカーネル命令を実行するのにかかる時間である.次に例を示します.
上記の例では、CPUをより消費していることがわかります.
5.システム定数PHPは非常に有用なシステム定数を提供し、現在の行番号(_LINE_)を得ることができます.ファイル(_FILE_)ディレクトリ(_DIR_)、関数名(_FUNCTION_)、クラス名(_CLASS_)、メソッド名(_METHOD_)と名前空間(_NAMESPACE_)、C言語に似ています.これらのものは主にデバッグに使われていると考えることができますが、必ずしもそうではありません.例えば、includeの他のファイルで使用することができますか?_FILE__ (もちろん、PHP 5.3以降に__DIR_)を使うこともできますが、次に例を示します.
以下、使用_LINE__ デバッグに役立つdebugの情報を出力します.
6.一意のIDを生成するにはmd 5()を使用して一意のIDを生成する人が多い.以下に示す.
//generate unique string
echo md5(time() . mt_rand(1,1000000));
実は、PHPにはuniqid()という関数があります.
生成されたIDの上位は同じであることに気づくかもしれませんが、これはジェネレータがシステムの時間に依存しているためです.これは実際には非常に良い機能です.これらのIDをソートしやすいからです.この点MD 5ではできません.
接頭辞を付けて重複を避けることもできます.
また、生成されたIDはMD 5よりも短くなり、多くのスペースを節約できます.
7.シーケンス化比較的複雑なデータ構造をデータベースまたはファイルに保存しますか?自分で自分のアルゴリズムを書く必要はありません.PHPはすでに2つの関数を提供しています.serialize()とunserialize()です.
これはPHPの原生関数ですが、今日JSONでますます流行しているので、PHP 5では.2以降、PHPはJSONをサポートし始め、jsonを使用することができます.encode()とjson_decode()関数
これはよりコンパクトに見え、Javascriptや他の言語にも互換性があります.しかし、非常に複雑なデータ構造では、データが失われる可能性があります.
8.文字列圧縮圧縮圧縮圧縮といえば、ファイル圧縮を思い浮かべるかもしれませんが、文字列も圧縮できます.PHPはgzcompress()とgzuncompress()関数を提供します.
圧縮率はほぼ50%である.また、gzencode()とgzdecode()関数を使用して圧縮することもできます.異なる圧縮アルゴリズムを使用する必要はありません.
9.登録停止関数register_という関数があります.shutdown_function()は、スクリプト全体が停止する前にコードを実行できます.次の例を見てみましょう.
上記の例は、関数の実行時間を計算するために使用されるにすぎません.その後、関数の間でexit()関数を呼び出すと、最後のコードは実行されません.また、このスクリプトがブラウザで終了した場合(ユーザーが停止ボタンを押す)、実行できません.
レジスターを使うとshutdown_function()の後、あなたのプログラムはスクリプトが停止した後でも実行されます.
//
function foo($arg1 = '', $arg2 = '') {
echo "arg1: $arg1/n";
echo "arg2: $arg2/n";
}
foo('hello','world');
/* :
arg1: hello
arg2: world
*/
foo();
/* :
arg1:
arg2:
*/
次にfunc_を用いた不定パラメータの関数を見てみましょうget_Args()メソッド:
// ,
function foo() {
//
$args = func_get_args();
foreach ($args as $k => $v) {
echo "arg".($k+1).": $v/n";
}
}
foo();
/* */
foo('hello');
/*
arg1: hello
*/
foo('hello', 'world', 'again');
/*
arg1: hello
arg2: world
arg3: again
*/
2. Glob()を使用してファイルを検索すると、多くのPHPの関数には長い自己解釈の関数名がありますが、glob()を見たとき、この関数が何に使われているのか分からないかもしれません.それに慣れていない限り.
この関数はscandir()と同じように、ファイルを検索するために使用できると思います.
// PHP
$files = glob('*.php');
print_r($files);
/* :
Array
(
[0] => phptest.php
[1] => pi.php
[2] => post_output.php
[3] => test.php
) */
// PHP TXT
$files = glob('*.{php,txt}', GLOB_BRACE);
print_r($files);
/* :
Array
(
[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);
/* :
Array
(
[0] => ../images/apple.jpg
[1] => ../images/art.jpg
)
*/
絶対パスを取得したい場合はrealpath()関数を呼び出すことができます.
$files = glob('../images/a*.jpg');
// applies the function to each array element
$files = array_map('realpath',$files);
print_r($files);
/* output looks like:
Array
(
[0] => C:/wamp/www/images/apple.jpg
[1] => C:/wamp/www/images/art.jpg
)
*/
3.メモリ使用情報あなたのプログラムのメモリ使用を観察すると、コードをより最適化することができます.
PHPはゴミ回収メカニズムがあり、複雑なメモリ管理メカニズムがあります.スクリプトが使用するメモリの状況を知ることができます.現在のメモリの使用状況を知るにはmemory_を使用します.get_USage()関数は、メモリのピークを使用することを知りたい場合はmemory_を呼び出すことができます.get_peak_USage()関数.
echo "Initial: ".memory_get_usage()." bytes /n";
/*
Initial: 361400 bytes
*/
//
for ($i = 0; $i < 100000; $i++) {
$array []= md5($i);
}
//
for ($i = 0; $i < 100000; $i++) {
unset($array[$i]);
}
echo "Final: ".memory_get_usage()." bytes /n";
/* prints
Final: 885912 bytes
*/
echo "Peak: ".memory_get_peak_usage()." bytes /n";
/*
Peak: 13687072 bytes
*/
4.CPU使用情報getrusage()関数を使用すると、CPUの使用状況を知ることができます.この機能はWindowsでは使用できません.
print_r(getrusage());
/*
Array
(
[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
)
*/
この構造はCPUについてよく知らない限り、難解に見えます.以下に説明します.
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:ユーザ状態時間(microseconds)
ru_utime.tv_sec:ユーザ状態時間(seconds)
ru_stime.tv_usec:システムカーネル時間(microseconds)
ru_stime.tv_sec:システムカーネル時間?(seconds)
スクリプトがどれだけCPUを消費しているかを見るには、「ユーザー状態の時間」と「システムカーネル時間」の値を見る必要があります.秒とマイクロ秒の部分はそれぞれ提供されており、マイクロ秒の値を100万で割って秒の値に追加すると、小数部のある秒数が得られます.
// sleep for 3 seconds (non-busy)
sleep(3);
$data = getrusage();
echo "User time: ".
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
echo "System time: ".
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000);
/*
User time: 0.011552
System time: 0
*/
sleepはシステム時間を消費しません.次の例を見てみましょう.
// loop 10 million times (busy)
for($i=0;$i<10000000;$i++) {
}
$data = getrusage();
echo "User time: ".
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
echo "System time: ".
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000);
/*
User time: 1.424592
System time: 0.004204
*/
これは約14秒のCPU時間を費やし,ほとんどがユーザの時間であり,システム呼び出しがないためである.
システム時間とは、CPUがシステム呼び出し上でカーネル命令を実行するのにかかる時間である.次に例を示します.
$start = microtime(true);
// keep calling microtime for about 3 seconds
while(microtime(true) - $start < 3) {
}
$data = getrusage();
echo "User time: ".
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
echo "System time: ".
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000);
/* prints
User time: 1.088171
System time: 1.675315
*/
上記の例では、CPUをより消費していることがわかります.
5.システム定数PHPは非常に有用なシステム定数を提供し、現在の行番号(_LINE_)を得ることができます.ファイル(_FILE_)ディレクトリ(_DIR_)、関数名(_FUNCTION_)、クラス名(_CLASS_)、メソッド名(_METHOD_)と名前空間(_NAMESPACE_)、C言語に似ています.これらのものは主にデバッグに使われていると考えることができますが、必ずしもそうではありません.例えば、includeの他のファイルで使用することができますか?_FILE__ (もちろん、PHP 5.3以降に__DIR_)を使うこともできますが、次に例を示します.
// this is relative to the loaded script's path
// it may cause problems when running scripts from different directories
require_once('config/database.php');
// this is always relative to this file's path
// no matter where it was included from
require_once(dirname(__FILE__) . '/config/database.php');
以下、使用_LINE__ デバッグに役立つdebugの情報を出力します.
// some code
// ...
my_debug("some debug message", __LINE__);
/*
Line 4: some debug message
*/
// some more code
// ...
my_debug("another debug message", __LINE__);
/*
Line 11: another debug message
*/
function my_debug($msg, $line) {
echo "Line $line: $msg/n";
}
6.一意のIDを生成するにはmd 5()を使用して一意のIDを生成する人が多い.以下に示す.
//generate unique string
echo md5(time() . mt_rand(1,1000000));
実は、PHPにはuniqid()という関数があります.
// generate unique string
echo uniqid();
/*
4bd67c947233e
*/
// generate another unique string
echo uniqid();
/*
4bd67c9472340
*/
生成されたIDの上位は同じであることに気づくかもしれませんが、これはジェネレータがシステムの時間に依存しているためです.これは実際には非常に良い機能です.これらのIDをソートしやすいからです.この点MD 5ではできません.
接頭辞を付けて重複を避けることもできます.
//
echo uniqid('foo_');
/*
foo_4bd67d6cd8b8f
*/
//
echo uniqid('',true);
/*
4bd67d6cd8b926.12135106
*/
//
echo uniqid('bar_',true);
/*
bar_4bd67da367b650.43684647
*/
また、生成されたIDはMD 5よりも短くなり、多くのスペースを節約できます.
7.シーケンス化比較的複雑なデータ構造をデータベースまたはファイルに保存しますか?自分で自分のアルゴリズムを書く必要はありません.PHPはすでに2つの関数を提供しています.serialize()とunserialize()です.
//
$myvar = array(
'hello',
42,
array(1,'two'),
'apple'
);
//
$string = serialize($myvar);
echo $string;
/*
a:4:{i:0;s:5:"hello";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:"two";}i:3;s:5:"apple";}
*/
//
$newvar = unserialize($string);
print_r($newvar);
/*
Array
(
[0] => hello
[1] => 42
[2] => Array
(
[0] => 1
[1] => two
)
[3] => apple
)
*/
これはPHPの原生関数ですが、今日JSONでますます流行しているので、PHP 5では.2以降、PHPはJSONをサポートし始め、jsonを使用することができます.encode()とjson_decode()関数
// a complex array
$myvar = array(
'hello',
42,
array(1,'two'),
'apple'
);
// convert to a string
$string = json_encode($myvar);
echo $string;
/* prints
["hello",42,[1,"two"],"apple"]
*/
// you can reproduce the original variable
$newvar = json_decode($string);
print_r($newvar);
/* prints
Array
(
[0] => hello
[1] => 42
[2] => Array
(
[0] => 1
[1] => two
)
[3] => apple
)
*/
これはよりコンパクトに見え、Javascriptや他の言語にも互換性があります.しかし、非常に複雑なデータ構造では、データが失われる可能性があります.
8.文字列圧縮圧縮圧縮圧縮といえば、ファイル圧縮を思い浮かべるかもしれませんが、文字列も圧縮できます.PHPはgzcompress()とgzuncompress()関数を提供します.
$string =
"Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Nunc ut elit id mi ultricies
adipiscing. Nulla facilisi. Praesent pulvinar,
sapien vel feugiat vestibulum, nulla dui pretium orci,
non ultricies elit lacus quis ante. Lorem ipsum dolor
sit amet, consectetur adipiscing elit. Aliquam
pretium ullamcorper urna quis iaculis. Etiam ac massa
sed turpis tempor luctus. Curabitur sed nibh eu elit
mollis congue. Praesent ipsum diam, consectetur vitae
ornare a, aliquam a nunc. In id magna pellentesque
tellus posuere adipiscing. Sed non mi metus, at lacinia
augue. Sed magna nisi, ornare in mollis in, mollis
sed nunc. Etiam at justo in leo congue mollis.
Nullam in neque eget metus hendrerit scelerisque
eu non enim. Ut malesuada lacus eu nulla bibendum
id euismod urna sodales. ";
$compressed = gzcompress($string);
echo "Original size: ". strlen($string)."/n";
/*
Original size: 800
*/
echo "Compressed size: ". strlen($compressed)."/n";
/*
Compressed size: 418
*/
//
$original = gzuncompress($compressed);
圧縮率はほぼ50%である.また、gzencode()とgzdecode()関数を使用して圧縮することもできます.異なる圧縮アルゴリズムを使用する必要はありません.
9.登録停止関数register_という関数があります.shutdown_function()は、スクリプト全体が停止する前にコードを実行できます.次の例を見てみましょう.
// capture the start time
$start_time = microtime(true);
// do some stuff
// ...
// display how long the script took
echo "execution took: ".
(microtime(true) - $start_time).
" seconds.";
上記の例は、関数の実行時間を計算するために使用されるにすぎません.その後、関数の間でexit()関数を呼び出すと、最後のコードは実行されません.また、このスクリプトがブラウザで終了した場合(ユーザーが停止ボタンを押す)、実行できません.
レジスターを使うとshutdown_function()の後、あなたのプログラムはスクリプトが停止した後でも実行されます.
$start_time = microtime(true);
register_shutdown_function('my_shutdown');
// do some stuff
// ...
function my_shutdown() {
global $start_time;
echo "execution took: ".
(microtime(true) - $start_time).
" seconds.";
}