結論から。
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桁のパーミッション表現を取得することが出来る。