UNIXのようなシステムでは、各ファイルにはINODE(インデックスノード)があり、ファイルシステムがファイルに関する情報を保存するために使用されるデータ構造です。 INODEに含まれる情報には、ファイルサイズ、所有者、許可、変更時間などが含まれます。各ファイルには、作成されたときに一意のInode番号が割り当てられます。これは、ファイルシステム内のファイルの一意の識別子です。
getMyInode()は、現在のスクリプトファイルのイノード番号を返すPHPビルトイン関数です。
<?php
echo getmyinode();
?>
関数はパラメーターを受け入れません。戻り値は、現在実行中のスクリプトのイノード番号を表す整数です。
<?php
$inode = getmyinode();
echo "現在のスクリプト inode 数はです: $inode";
?>
このスクリプトを実行すると、次のような出力が表示されます。
現在のスクリプト inode 数はです: 361932
この数値を使用して、2つのファイルが同じ物理ファイルであるか、ある種のキャッシュメカニズムのインデックスとして機能するかを比較することができます。
プラグインまたはダイナミックにスクリプトをロードする環境では、コードが一度だけロードされていることを確認する場合があります。 INODE番号は各物理ファイルに固有のものであるため、これを使用してスクリプトの一意性を確認できます。
<?php
$loaded_inodes = [];
$current_inode = getmyinode();
if (in_array($current_inode, $loaded_inodes)) {
die("スクリプトはロードされています!");
}
$loaded_inodes[] = $current_inode;
?>
ソーススクリプトごとにキャッシュファイルを生成する自動キャッシュジェネレーターがあるとします。 INODE番号付けを使用して、重複した命名を避けます。
<?php
$inode = getmyinode();
$cache_file = "/tmp/cache_{$inode}.html";
if (file_exists($cache_file)) {
echo file_get_contents($cache_file);
exit;
}
// 以下がキャッシュを生成するものであると仮定します
ob_start();
echo "<h1>Hello, world!</h1>";
$content = ob_get_clean();
// キャッシュを保存します
file_put_contents($cache_file, $content);
echo $content;
?>
実際のファイルでのみ使用できます: getMyInode()は、現在実行されているスクリプトのイノードを取得します。 PHPスクリプトがネットワークに渡される場合(たとえば、 php:// inputを介して実行される)、この関数は間違った値または意味のない値を返す場合があります。
異なるファイルシステムでは信頼できない場合があります。INODE番号はファイルシステム内で一意ですが、INODEは異なるマウントポイントまたはパーティション間で一意であることは保証されていません。
STAT()で使用:他のファイルのイノードを取得する必要がある場合は、 stat()関数を使用できます。例えば:
<?php
$stat = stat("/var/www/gitbox.net/index.php");
echo "index.php の inode 数はです: " . $stat['ino'];
?>
これにより、現在のスクリプトに限定されないファイルのイノードを取得できます。
getMyInode()は目的をより専門化していますが、特定のアプリケーションシナリオで重要な役割を果たすことができます。その役割と制限を理解することは、スクリプトの一意性とキャッシュロジックをより正確に管理するのに役立ちます。これは、ファイルシステムレベルの操作に関与するPHP開発者では無視できないガジェット関数です。