勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PHPにて「php-ulid」ライブラリを用いてULIDを生成する方法

  PHP

先日MySQLにてUUIDを発行するメモを書いたがUUID v1だと生成時間によるソートが行えない。何か方法が無いか調べたところUUID v7を使用するか、もしくはULIDというものを使用する形が良さそう。UUID v7に関しては過去記事の方法で生成できるため、今回はULIDの生成方法をメモ。

 

robinvdvleuten / php-ulid

GitHub

https://github.com/robinvdvleuten/php-ulid

 

インストール

composerでインストールする場合

サーバにSSH接続し以下コマンドでインストールする。

composer require robinvdvleuten/ulid

手動でインストールする場合

GitHubからソースコードをまとめてダウンロードし展開した上で「src」ディレクトリ内のファイルをアップロードする。今回はこちらの方法を取った。

 

利用方法

ソースコード

<?php
require 'Ulid.php';
require './Exception/InvalidUlidStringException.php';

use Ulid\Ulid;

$ulid = Ulid::generate();
var_dump((string)$ulid); //string(26) "01JD9D20QFHN0KH86M4AW0WY68" 

//小文字指定する場合
$ulid = Ulid::generate(true);
var_dump((string)$ulid); //string(26) "01jd9dyejqhjx6rmwpw3k07mzt"

 

ULIDとは

UUIDと同様にランダムな識別子になる。識別子の先頭にタイムスタンプを置いているためソートが可能。

26文字になるのでMySQLに格納する場合データ型は「CHAR(26)」になりそう。

ちなみにUUID v7もソートが可能でこちらは36文字。

 

2038年問題は?

タイムスタンプを先頭に置いているとのことなので2038年問題が気になった。

タイムスタンプを指定してULIDを発行できるため以下をテストしてみたところ特に問題無さそう。

$ulid = Ulid::fromTimestamp(1704132245000); //2024/01/02 03:04:05
var_dump((string)$ulid); //string(26) "01HK334XG8XMSW75ZS7EQTKQ6Y" 

$ulid = Ulid::fromTimestamp(2147483648000); //2038/01/19 12:14:08
var_dump((string)$ulid); //string(26) "01YG00000090FWZZTQ1T3QEDT0" 

$ulid = Ulid::fromTimestamp(2526174848000); //2050/01/19 12:14:08
var_dump((string)$ulid); //string(26) "029GNW2900YK9GK0GKWK9KCQ26"

 - PHP

  関連記事

MySQLのバックアップファイルを簡単に作成できるライブラリ「myphp-backup」の利用方法

MySQLのバックアップを取る際にadminerとかから手動で対応するのではなく ...

PHPで画像を比較して類似度を算出する「image-comparator」ライブラリの利用方法

PHPで画像の類似度を計測したい。ただ、そのためのロジックが全く分からないためラ ...

PHPでGoogle翻訳を手軽に扱えるライブラリ「google-translate-php」の利用方法

サイト内で一部テキストのGoogle翻訳を行いたい。ただ、Google Clou ...

PHPでエラーメッセージを見やすくするwhoopsの利用方法

PHPのエラーメッセージが見づらい。これはこういうもの、と諦めていたがCodei ...

Composer無し&ファイル1枚でPHPのエラーメッセージ画面をリッチにするライブラリ「PHP Error」の利用方法

先日PHPのエラーメッセージを見やすくするwhoopsの利用方法をメモしたが導入 ...