読者です 読者をやめる 読者になる 読者になる

PHPと32bit整数値

日常

Fedoraとかもそうだけど、LinuxディストリビューションはISOイメージで提供されていることが多くて、最近はDVD用のサイズの大きいモノもある。おおよそ4.5GBくらい。CD-ROM用だと640MB程度なんだけど。

で、会社ではダウンロードしてきたISOイメージをファイルサーバに置いておいて、必要な時にautofsでloopbackマウントして中身を参照できるようにしている。これはこれで便利だけども、別に大した事をやっているわけじゃない。

ここまで前フリ

ある日、先輩のヒトコト
「暇なときでいいんだけど、これ、RPMファイルの検索機能とか付けられない?」

というわけで、"kernel"とか打ち込んだらカーネルのRPMパッケージへのリンクが表示されるような機能をチャキチャキと作ることになったわけだ。
どういう風にしたかというと
1. autofsのエントリファイルからISOイメージのエントリを取り出す。
2. ISOイメージをマウントして、中身のRPMファイルの情報を全部DBにぶち込む。(2回目以降はISOイメージのタイムスタンプの確認だけでOK)
3. DBに格納したRPMファイルの一覧をPHPスクリプトからクエリを投げて検索

単純な話なんだけども、DVD用のISOイメージにアクセスした時に問題発生。
stat() 関数でISOイメージのタイムスタンプを取ろうとしたら、エラーが返却される。タイムスタンプのみを返す mtimefile() でも同じ。
どうも、ファイルの大きさが31か32-bitで表現できる範囲を超えると、この辺の関数がエラーになってしまうようだ。

仕方ないので、こんな風にしてファイルのタイムスタンプを取ってみた。

$ctime = intval(trim(shell_exec("stat -c '%Y' $fname")));

statコマンドにはそんな制限はないので、UNIX-epochからの秒数を表示させて、それをintegerに変換して代入。見た感じからしてAd-hocで非常にアレ。

※ 文体変えてみましたw