PHP

【PHP】echo()、print()どっちが速いか。

結論から。

 

echo()のほうが速い。

 

そもそも。print()は内部でecho()を呼んでおり、返り値として必ず1を返却している。
そして最後にはFREE(メモリの開放?)処理を行うためecho()よりも若干パフォーマンスが下がるのである。

実際の動作はオペコードを見れば簡単に違いを確認できるが詳細は各自参照されたし。

オペコードに関しては下記URLを参照されたし。
http://www.php.net/manual/ja/internals2.opcodes.php

 

【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()と同様、スマートな記述にはもってこいである。

 

【PHP】正規表現自分用まとめ。

自分用メモ。

文字クラス 詳細
[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】HTTP通信のレスポンスヘッダを取得する方法。

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 ])

どこかで使えそうだったので一応メモ。

【PHP】nl2br()おさらい。

自分用。

まず関数の定義。

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的な観点からすると気をつけたいところ。

【PHP】ファイルの最終アクセス日時・更新日を変更する。

メモ。

touch()関数の第2引数にタイムスタンプを渡してやることで、標題のパラメーターを指定した値に設定することが可能。

$filePath = '/path/to/targetFile.ext';

// 最終更新日、最終アクセス日を1時間前に設定する
touch($filePath, time() - 3600);

// 最終更新日、最終アクセス日を1日前に設定する
touch($filePath, strtotime('-1 day'));

え、いつ使うかって?今でs(ry
使うときは使うんですよ結構。これは相当便利。

 

【PHP】超絶便利関数、file_put_contents()の動作を理解する。

めも。

通常ファイルに値を書き込みたい際は、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()で事足りてしまうと考えられる。

 

【PHP】ファイル、ディレクトリのパーミッションを取得する。

めも。

下記はファイル、ディレクトリ共にパーミッション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桁のパーミッション表現を取得することが出来る。