【PHP8.x】ftok関数の使い方

作成日: 更新日:

ftok関数は、System V IPC(Inter-Process Communication、プロセス間通信)の際に必要となる、ユニークなキーを生成する関数です。このキーは、異なるPHPプロセス間で共有メモリ、メッセージキュー、セマフォといったリソースを識別し、アクセスするために利用されます。複数のプロセスが同じ共有リソースにアクセスする場合、どのリソースを対象とするかを明確にするための共通の識別子が必要となり、ftok関数がその役割を果たします。

この関数は、キーを生成するために二つの情報を使用します。一つは既存のファイルへのパスで、通常はシステム上の適当なファイル(例: /tmpディレクトリ内のファイル)や、アプリケーションのメインスクリプトファイルなどを指定します。もう一つは、0から255までの範囲で指定する整数値のプロジェクトIDです。同じファイルパスとプロジェクトIDの組み合わせからは、常に同じキーが生成されるという特性があります。これにより、異なるプロセスがそれぞれftok関数を呼び出しても、意図する共有リソースに対して同じキーを取得し、確実に連携できるようになります。

生成されたキーは、shm_get_id(共有メモリの取得)、msg_get_queue(メッセージキューの取得)、sem_get_sem(セマフォの取得)といったPHPのIPC関連関数に渡して使用されます。これにより、PHPアプリケーションはプロセス間の効率的なデータ交換や同期制御を実現するための基盤を構築できます。

基本的な使い方

構文(syntax)

<?php
$pathname = '/tmp/my_file'; // 既存のファイルパスを指定
$proj = 'S';               // 1文字のプロジェクト識別子を指定
$key = ftok($pathname, $proj);
// $key には、生成されたIPCキー(整数値)が格納される
?>

引数(parameters)

string $filename, string $project_id

  • string $filename: キーを生成するためのファイルパスを指定する文字列
  • string $project_id: キーを生成するためのプロジェクトIDを指定する文字列

戻り値(return)

int|false

ftok関数は、指定されたファイルパスからIPCキーを生成し、int型の整数を返します。ファイルシステムへのアクセス権がない場合や、無効なファイルパスが指定された場合は、falseを返します。

サンプルコード

PHP ftok でIPCキーを生成する

<?php

declare(strict_types=1);

/**
 * 指定されたファイルパスとプロジェクトIDからSystem V IPCキーを生成します。
 *
 * ftok()は、既存のファイルパス (pathname) とプロジェクトID (proj_id) から
 * プロセス間通信(IPC)で使用するための一意なキーを生成します。
 * "from a file to a key" (ファイルからキーへ) という処理を具現化する関数です。
 *
 * @return void
 */
function generateIpcKeyFromFile(): void
{
    // IPCキーの生成元となるファイル。このファイルは実際に存在する必要があります。
    // ここでは、このPHPスクリプトファイル自身を元にします。
    $filePath = __FILE__;

    // プロジェクトID (1文字の文字列)。
    // 同じファイルでも、このIDが異なると生成されるキーも異なります。
    $projectId = 'p';

    echo "ファイルパス: {$filePath}" . PHP_EOL;
    echo "プロジェクトID: {$projectId}" . PHP_EOL;

    // ftok() を使って、ファイルパスとプロジェクトIDからIPCキーを生成します。
    // 成功した場合は整数型のキーが、失敗した場合は false が返されます。
    $ipcKey = ftok($filePath, $projectId);

    if ($ipcKey === false) {
        echo "IPCキーの生成に失敗しました。" . PHP_EOL;
        echo "指定されたファイルが存在し、アクセス可能か確認してください。" . PHP_EOL;
    } else {
        echo "生成されたIPCキー: {$ipcKey}" . PHP_EOL;
    }
}

// 関数を実行してキーを生成・表示します。
generateIpcKeyFromFile();

このサンプルコードは、ftok関数を使用してSystem V IPCキーを生成する方法を示しています。ftok関数は、指定されたファイルパスとプロジェクトIDという2つの引数から、プロセス間通信で使われる一意の整数キーを作り出します。

コード内では、まずキー生成の元となるファイルパスとして、実行中のPHPスクリプト自身のパスを示す__FILE__を変数$filePathに設定しています。次に、プロジェクトIDとして1文字の文字列'p'を変数$projectIdに設定します。同じファイルパスであっても、このIDが異なれば生成されるキーも変わります。

ftok($filePath, $projectId)を呼び出すことで、これら2つの引数を基にIPCキーが生成されます。この関数の戻り値は、成功した場合は整数型のキー、失敗した場合はfalseとなります。そのため、if文で戻り値がfalseかどうかを厳密に判定し、処理の成否に応じてメッセージを出し分けています。この関数を正しく動作させるには、第1引数で指定するファイルが実際に存在し、アクセス可能であることが重要です。

ftok関数を使用する際、第1引数に指定するファイルは実際に存在し、かつスクリプトにアクセス権限があることが必須です。存在しないファイルを指定するとキーの生成に失敗します。第2引数のプロジェクトIDは1文字の文字列を指定してください。複数文字を指定してもエラーにはなりませんが、意図しないキーが生成される可能性があります。この関数はLinuxなどUNIX系のOSで利用でき、Windows環境では動作しない点にも注意が必要です。関数の戻り値は失敗時にfalseを返すため、サンプルコードのように===演算子で厳密に判定することが推奨されます。生成されたキーは、共有メモリなど複数のプロセス間で通信を行う際の識別子として利用されます。

【PHP8.x】ftok関数の使い方 | いっしー@Webエンジニア