takami_hirokiの日記

2010-10-25

PHPで一意な値を生成する

MySQLレプリケーションのように、ステートメントベースのレプリケーションの場合には、auto_incrementなどの実行時に値が不定な関数は利用が推奨されません。従って、プログラム側で、一意となる値を生成する必要があります。そのような場合、PHPでは、以下のような「uniqid」という関数が利用できます。

string uniqid ([ string $prefix = "" [, bool $more_entropy = false )

マイクロ秒単位の現在時刻にもとづいた、接頭辞つきの一意な ID を取得します。

404 Not Found

uniqid関数の利用例

以下のように書くことで、$prefixの後に、マイクロ秒単位の現在時刻に基づいた文字列が生成されます。

[root]# php -r 'echo uniqid("PRIMARY_");'
PRIMARY_4cc4f4844c2ed

より一意な値とするために

上記の書き方は、あくまで、マイクロ秒単位の違いしかないため、同じ値になる可能性はゼロではありません。

従って、より一意性を高めるために「$prefixを固定文字列ではなく乱数とする」ことを考えます。

[root]# php -r 'echo uniqid(mt_rand());'
5770971284cc4f4b946722

さらに、一意性を高めるために、「第二引数の$more_entropy」を利用します。

TRUE にすると、uniqid() は 返り値の最後にさらに別のエントロピーを (線形合同法を使用して) 追加します。これにより、結果がより一意になります。

404 Not Found
[root]# php -r 'echo uniqid(mt_rand(), true);'
6929848604cc4f53f3ec374.52375463

DBPK生成に利用する場合

Modelの層で、以下のような関数を用意して利用するとよいかもしれません。

ここでは、md5関数を通しています。難読化と、桁数揃えを同時にできて便利かと思います。

public function getPrimaryKey() {
    return md5( uniqid(mt_rand(), true) );
}

よく使うPHPのコマンドラインオプション

個人的によく使う、PHPのコマンドラインオプションをまとめておきます。

参考URL:PHP をコマンドラインから使用する (機能) - PHPプロ!マニュアル


PHPのバージョンを確認 (php -v, php --version)

[実行例]
[root]# php -v
PHP 5.2.9 (cli) (built: May 14 2009 20:58:31)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
    with eAccelerator v0.9.5.3, Copyright (c) 2004-2006 eAccelerator, by eAccelerator

PHPの設定情報の確認 (php -i, php --info)

phpinfo()の実行結果が表示されます。表示される量が多いので、grepで欲しい情報の部分のみ抜き出すなどの使い方が多いと思います。

[実行例]
[root]# php -i | head
phpinfo()
PHP Version => 5.2.9
 ・
 ・

コマンドラインのみで PHP を実行 (php -r, php --run)

PHP の開始および終了タグ () を書かずに、実行できます。PHPの関数を簡単に試してみることができます。

[実行例]
[root]# php -r 'echo mt_rand();'

指定したPHPファイルを実行 (php -f, php --file)

任意のPHPファイルを指定して、実行することができます。

[実行例]
[root]# php -f index.php

任意場所のphp.iniを指定して実行 (php -c)

PHPでバッチアプリケーションなんかを作る時に、WEBアプリとは別のphp.iniを読み込みたいことがありますが、その場合は、このオプションを利用します。

[実行例]
[root]# php -c ./config/php.ini
Connection: close