【PHP】プロセスをバックグラウンド処理する。

よく使うので自分用メモ。

// 実行ファイル(.php)パス
$execFilePath = '/path/to/target.php';
// パラメーターを渡したい場合は以下の通り
$arg1 = 'param1';
$arg2 = 'param2';
$arg3 = 'param3';
$arg4 = 'param4';
$arg5 = 'param5';
// 実行コマンドを整形する(最後のアンパサンドは、処理をバックグラウンドで行うという意味)
$cmd = "nohup php -c '' '".$execFilePath."' '".$arg1."' '".$arg2."' '".$arg3."' '".$arg4."' '".$arg5."' > /dev/null &";
// バックグラウンド実行されたコマンドのプロセスIDを取得したい場合は、実行コマンドの末尾を以下のようにする
$cmd = "nohup php -c '' '".$execFilePath."' '".$arg1."' '".$arg2."' '".$arg3."' > /dev/null & echo $!";
// 実行する。
$output = array();
// $outputにバックグラウンドで実行中のプロセスIDが格納されている
exec($cmd, $output);

なぜ「echo $!」でプロセスIDが取得できるのかというと、Linuxがバックグラウンド処理中のPIDを変数$!に突っ込んでくれているからである。

 

【PHP】関数のエイリアスを把握する。

fwrite()関数とfprintf()関数の違いを調べていたらエイリアスという概念があることを知ったのでメモ。

エイリアスとは、複数の名前を持つけれども動作は同じ関数のことを言うらしい。

たとえばfputs()関数はfwrite()関数のエイリアスであり、使用されている拡張モジュールが同一なため、実行結果として同一の値を得ることができる。

よく使うところで例を挙げると、die()もexit()のエイリアス関数だったりする。

まとめると、互換性の観点で古い名前を残しているからどっち使っても良いけど、なるべく元の関数を使おうね!という話である。

その他の関数エイリアス一覧は以下URLを参照されたし。
http://php.net/manual/ja/aliases.php

 

【PHP】fprintf()、vfprintf()の違い。

前回の記事←に引き続き、printf()系の関数はこれで出尽くしたかな。

■fprintf()

フォーマットした文字列をファイルストリームに書き込む。
第一引数にファイルポインタを指定し、第二引数にフォーマット、それ以降に置換文字列を指定する。

■vfprintf()

フォーマットした文字列をファイルストリームに書き込む。
上記関数との違いは置換文字列を配列として受け取る点。(第三引数に配列で置換文字列を渡してあげればよい。)

 

にしても種類が多い。
printf(), sprintf(), vprintf(), vsprintf(), fprintf(), vfprintf()

細かいけど重要。

PHPで使用可能なキャストまとめ。

基本を大切に。

キャスト 詳細
(int)、(integer) 整数型にキャスト
(float)、(double)、(real) フロート型にキャスト
(bool)、(boolean) ブーリアン型にキャスト
(string) 文字列型にキャスト
(array) 配列型にキャスト
(object) オブジェクト型にキャスト
(binary) バイナリ文字列型にキャスト
(unset) null型にキャスト

PHPは暗黙の型変換があるからあまり変数の型を意識することがないけど、知ってるとやっぱり便利。

PHPのprintf()とsprintf()の違い。

よーーーーやく解ったのでメモ。

■printf()

フォーマットした文字列を標準出力(STD_OUT)する。
※文字列のバイト数を返り値として返却するため、結果を変数に格納することは出来ない。

■sprintf()

フォーマットした文字列を返却する。
※当然変数などを受け皿に格納することが可能。

 

似たような関数にvprintf()とvsprintf()があるがこれも引数の違い除き上記と同様の動作をする。

■vprintf()

配列形式の情報を引数で受け取り、フォーマットした文字列を標準出力(STD_OUT)する。
※文字列のバイト数を返り値として返却する。

■vsprintf()

配列形式の情報を引数で受け取り、フォーマットした文字列を返却する。

 

超スッキリ。

正規表現で文字列を抜き出したい時の自分用メモ。

みんな大好きpreg_match()!!
※PHPです。

$str = 'abcdefghijklmnopqrstuvwxyz';
$regex = '/abc(.*?)jkl/';
preg_match($regex, $str, $match);

var_dump($match);
↓
array(2) { [0]=> string(12) "abcdefghijkl" [1]=> string(6) "defghi" }

抜き出したい部分を「(.*?)」で置き換えるのが肝。
ちょっとずつ正規表現に対しても抵抗なくなってきたかな。

PHPで「self::」と「$this」の違いを理解する。

これを完全に理解しきるには一筋縄じゃいかない模様。
とりあえず自分用にザックリめも。

まず、標題の件に関して。

■self::
自クラスのプロパティ、及びメソッドへの静的アクセス。

■$this
自分自身のオブジェクトを指す。

 

次に、そもそも論として。

 

・クラスプロパティもしくはメソッドを static として宣言することで、 クラスのインスタンス化の必要なしにアクセスすることができます。 static なプロパティは、インスタンス化されたクラスオブジェクトから アクセスすることはできません (static なメソッドにはアクセスできます)。

・static メソッドは、オブジェクトのインスタンスを生成せずに コールすることができます。疑似変数 $this は、 static として宣言されたメソッドの内部から利用することはできません。

・static プロパティは、矢印演算子 -> によりオブジェクトからアクセス することはできません。

・static でないメソッドを静的にコールすると、E_STRICT レベルの 警告が発生します。

公式リファレンスより引用

 

上記の説明で大体理解は出来た。
一応セーフなパターンとアウトなパターンを実験してみる。

<?php
class selfAndThis {

	public $param1 = 'hoge';
	
	public static $param2 = 'piyo';	

}

例えば上記のようなクラスがあったとしたら。

// 下記はセーフ
$obj = new selfAndThis();
$res1 = $obj->param1;
$res2 = selfAndThis::$param2;

// 下記はアウト
$obj = new selfAndThis();
$res1 = $obj->param2;
$res2 = selfAndThis::$param1;

※$res1 : staticプロパティにはインスタンス化したオブジェクトからはアクセスできないためエラーとなる。(staticプロパティはアロー演算子「->」によるアクセスが出来ない。)
※$res2 : staticでないプロパティはインスタンス生成無しでアクセスできないためエラーとなる。

次にメソッド編。ようやくself::のお出まし。
上記のクラスに一つのメソッドを追加して実験。

<?php
class selfAndThis {
	
	public $param1 = 'hoge';
	
	public static $param2 = 'piyo';
	
	public static function test() {
		return self::$param2;
	}
}

staticなメソッドに関してはインスタンス化の有無を問わず呼び出すことが可能。
よって以下の呼び出し方は共にセーフ。

$obj = new selfAndThis();
$res1 = $obj->test();
$res2 = selfAndThis::test();

var_dump($res1, $res2);
↓
string(4) "piyo" string(4) "piyo"

そして以下アウトなパターン。
staticメソッド内で疑似変数$thisを使っているとアウト。

// Fatalエラー
public static function test() {
	return $this->param2;
}

他にもパターンをあげていくとキリがないが、スコープ定義演算子やstaticキーワードに関しては今後も知識を深めていく必要がありそう。

PHPで無名関数を使ってみる。

Javascriptでおなじみの無名関数をPHPでも使えるみたいだったので遊んでみた。※PHP5.3以上に限る

とりあえずいつもどおり書いてみる。

$a = 'Hello ';
		
$noname = function($a = null) {
	return $a . 'world!!';
};

// 変数を渡さない場合
$res = $noname();
var_dump($res);
↓
string(7) "world!!"

// 変数を渡した場合
$res = $noname($a);
var_dump($res);
↓
string(13) "Hello world!!"

ちょっと感動。
そして下記例のように「use」を用いることで、無名関数の外にあるスコープの変数を無名関数内に渡すことが可能。
ここでは分かりやすく単なる変数で実験。

$a = 'Hello ';
$b = 'my ';

$noname = function($b = null) use ($a) {
	return $a . $b . 'world!!';
};

// 関数実行時に変数を渡さなくても、$aの'Hello 'は内部から使用することができる。
$res = $noname();
var_dump($res);
↓
string(13) "Hello world!!"

// 実行時変数を渡せばもちろん以下の結果になる。
$res = $noname($b);
var_dump($res);
↓
string(16) "Hello my world!!"

これはおもしろい。再帰処理とかコールバックとかいろいろ楽しいことができそうな予感。積極的に使ってみよう。