結論から。
echo()のほうが速い。
そもそも。print()は内部でecho()を呼んでおり、返り値として必ず1を返却している。
そして最後にはFREE(メモリの開放?)処理を行うためecho()よりも若干パフォーマンスが下がるのである。
実際の動作はオペコードを見れば簡単に違いを確認できるが詳細は各自参照されたし。
オペコードに関しては下記URLを参照されたし。
http://www.php.net/manual/ja/internals2.opcodes.php
結論から。
echo()のほうが速い。
そもそも。print()は内部でecho()を呼んでおり、返り値として必ず1を返却している。
そして最後にはFREE(メモリの開放?)処理を行うためecho()よりも若干パフォーマンスが下がるのである。
実際の動作はオペコードを見れば簡単に違いを確認できるが詳細は各自参照されたし。
オペコードに関しては下記URLを参照されたし。
http://www.php.net/manual/ja/internals2.opcodes.php
変数名をキーに、その値をバリューとして配列を生成する方法。
早い話がextract()の間逆の動作をさせたい場合。
// 以下のような変数があったとする
$param1 = 'hoge';
$param2 = 'piyo';
$param3 = 'fuga';
// compact()には配列形式にまとめた変数名リストで渡すこともできる
$multi = array('param2', 'param3');
// 変数名を指定してやることで配列キーとバリューに突っ込んでくれる
$array = compact('param1', $multi);
var_dump($array);
↓
array(3) {
["param1"]=>
string(4) "hoge"
["param2"]=>
string(4) "piyo"
["param3"]=>
string(4) "fuga"
}
extract()と同様、スマートな記述にはもってこいである。
自分用メモ。
| 文字クラス | 詳細 |
|---|---|
| [qwerty] | 「q,w,e,r,t,y」の何れか一文字 |
| [^qwerty] | 「q,w,e,r,t,y」以外の一文字 |
| [0-9] | 数字(0~9)一文字 |
| [A-Z] | 大文字アルファベット一文字 |
| [a-z] | 小文字アルファベット一文字 |
| [a-zA-Z0-9] | アルファベットか数字一文字 |
| [!-~] | 半角文字一文字(エクスクラメーションからチルダ記号まで) |
| \w | アルファベット、数字、アンダースコア、何れか一文字 |
| \W | アルファベット、数字、アンダースコア、以外の一文字 |
| \d | [0-9]と等価 |
| \D | [^0-9]と等価 |
| \s | 空白一文字([\r\n\t\v\f]と等価) |
| \S | 空白以外の一文字([^\r\n\t\v\f]と等価) |
| \r | 改行コード |
| \n | 改行コード |
| \t | タブ文字 |
| \v | 垂直タブ |
| \f | 改ページ |
| 量指定子 | 詳細 |
|---|---|
| * | 0回以上の繰り返し |
| + | 1回以上の繰り返し |
| ? | 0~1回の出現 |
| {n} | n回の繰り返し |
| {n,m} | n回以上、m回以下の繰り返し |
| {n,} | n回以上の繰り返し |
| メタ文字 | 詳細 |
|---|---|
| . | 改行以外の一文字 |
| ^ | 行頭 |
| $ | 行末 |
| | | 複数の文字列の何れか(例:’/a|b|c/’) |
| () | グループ化 |
| \ | エスケープシーケンス(バックスラッシュ) |
| 修飾子(末端のデリミタ後に付与) | 詳細 |
|---|---|
| i | 大文字、小文字を無視 |
| s | シングルラインモード |
| m | マルチラインモード |
| u | マルチバイトモード(UTF-8) |
PHPで取得する方法めも。
$url = 'http://example.com';
$res = get_headers($url);
var_dump($res);
↓
array(13) {
[0]=>
string(15) "HTTP/1.0 200 OK"
[1]=>
string(20) "Accept-Ranges: bytes"
[2]=>
string(29) "Cache-Control: max-age=604800"
[3]=>
string(23) "Content-Type: text/html"
[4]=>
string(35) "Date: Sun, 08 Sep 2013 15:49:42 GMT"
[5]=>
string(18) "Etag: "3012602696""
[6]=>
string(38) "Expires: Sun, 15 Sep 2013 15:49:42 GMT"
[7]=>
string(44) "Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT"
[8]=>
string(22) "Server: ECS (sjc/4FCE)"
[9]=>
string(12) "X-Cache: HIT"
[10]=>
string(20) "x-ec-custom-error: 1"
[11]=>
string(20) "Content-Length: 1270"
[12]=>
string(17) "Connection: close"
}
get_headers()の第2引数に0以外の値を渡すと、配列のキーに「Content-Type」やら「Content-Length」やらが入ってくれる。
$url = 'http://example.com';
$res = get_headers($url, 1);
var_dump($res);
↓
array(13) {
[0]=>
string(15) "HTTP/1.0 200 OK"
["Accept-Ranges"]=>
string(5) "bytes"
["Cache-Control"]=>
string(14) "max-age=604800"
["Content-Type"]=>
string(9) "text/html"
["Date"]=>
string(29) "Sun, 08 Sep 2013 15:52:38 GMT"
["Etag"]=>
string(12) ""3012602696""
["Expires"]=>
string(29) "Sun, 15 Sep 2013 15:52:38 GMT"
["Last-Modified"]=>
string(29) "Fri, 09 Aug 2013 23:54:35 GMT"
["Server"]=>
string(14) "ECS (sjc/4FB4)"
["X-Cache"]=>
string(3) "HIT"
["x-ec-custom-error"]=>
string(1) "1"
["Content-Length"]=>
string(4) "1270"
["Connection"]=>
string(5) "close"
}
関数の定義は以下の通り。
array get_headers(string $url [, int $format = 0 ])
どこかで使えそうだったので一応メモ。
自分用。
まず関数の定義。
string nl2br(string $string [, bool $is_xhtml = true])
第2引数に「true」を指定するか省略した場合、「<br />」が出力され、「false」を指定した場合、「<br>」になる。
$string = "This \n\ris \r\nmy \rfavorite \nfruit."; echo nl2br($string); ↓ This <br /> is <br /> my <br /> favorite <br /> fruit. echo nl2br($string, false); ↓ This <br> is <br> my <br> favorite <br> fruit.
細かいけど、SEO的な観点からすると気をつけたいところ。
メモ。
touch()関数の第2引数にタイムスタンプを渡してやることで、標題のパラメーターを指定した値に設定することが可能。
$filePath = '/path/to/targetFile.ext';
// 最終更新日、最終アクセス日を1時間前に設定する
touch($filePath, time() - 3600);
// 最終更新日、最終アクセス日を1日前に設定する
touch($filePath, strtotime('-1 day'));
え、いつ使うかって?今でs(ry
使うときは使うんですよ結構。これは相当便利。
めも。
通常ファイルに値を書き込みたい際は、fopen()でファイルポインタを開き、fwrite()、fclose()、という操作をするが、file_put_contents()はこれを一度にやってくれる。
$filePath = '/path/to/targetFile.ext'; $data = 'testMessage'; // 一気にファイル操作を行ってくれる file_put_contents($filePath, $data);
上記に示した操作と、下記に示す操作は全く等価の動作を行う。
$filePath = '/path/to/targetFile.ext'; $data = 'testMessage'; // file_put_contents()の内部動作 $fp = fopen($filePath, 'w'); fwrite($fp, $data); fclose($fp);
またfile_put_contents()は第1引数に指定したファイルが存在しない場合、作成を試み、存在する場合は上書きを行う。これはfopen()関数の「w」モードと同様である。
追記モードでファイル操作を行いたい場合は、第3引数に「FILE_APPEND」を指定することで、fopen()の「a」モードと同様の動作を行う。
第3引数に渡せる定数は以下に示すものが存在し、複数のモードを指定したい場合は「|」(OR演算子)で連結し指定すればよい。
| 定数 | 詳細 |
|---|---|
| FILE_APPEND | ファイルが存在している場合、上書きではなく追記を行う。 |
| LOCK_EX | 書き込み処理中にファイルを排他ロックする。 |
| FILE_USE_INCLUDE_PATH | ファイルをインクルードディレクトリから探す。 |
$filePath = '/path/to/targetFile.ext'; $data = 'testMessage'; // 書き込み中にファイルを排他ロックし、追記モードで動作させる。 file_put_contents($filePath, $data, FILE_APPEND | LOCK_EX);
fopen()を用いてファイル操作を行う際、重複書き込みを防ぐためflock()関数を使用し、ロック→書き込み→ロック開放という手順を踏む必要があったが、file_put_contents()の場合第3引数に「LOCK_EX」を指定するだけで、この操作さえ一気にやってくれてしまう。
それでも「LOCK_SH」や「LOCK_NB」モードを指定したい場合のみ、flock()関数を用いるアプローチを選択する必要があるが、ほとんどの場合file_put_contents()で事足りてしまうと考えられる。
めも。
下記はファイル、ディレクトリ共にパーミッション777のもので実験。
$fileDir = '/path/to/fileDir'; $filePath = '/path/to/filePath.ext'; $dirPerms = fileperms($fileDir); $filePerms = fileperms($filePath); var_dump($dirPerms, $filePerms); ↓ int(16895) int(33279)
但しfileperms()関数で取得できるパーミッション情報は、上記の通り10進数で表現されるため、普段見慣れている形式で取得したい場合は、8進数形式にフォーマットしてやる必要がある。
$dirPerms = substr(sprintf('%o', fileperms($fileDir)), -4);
$filePerms = substr(sprintf('%o', fileperms($filePath)), -4);
var_dump($dirPerms, $filePerms);
↓
string(4) "0777" string(4) "0777"
sprintf()の第1引数「%o」は引数を8進数にフォーマットするという意味。その後、substr()で得られた値の後ろから4文字を切り出すことで、見慣れた4桁のパーミッション表現を取得することが出来る。