はじめに
これまでの記事で、mnoGoSearch検索エンジンとの連携用関数である udm_add_search_limit() と udm_alloc_agent() を取り上げ、いずれもPHP 5.1.0で本体から削除されていることを紹介してきました。今回は、この一連の udm_* 関数群の中でも特にシンプルな udm_api_version() を解説します。
udm_api_version() は、サーバーにインストールされているmnoGoSearchのAPIバージョンを数値で取得するための関数でした。他の udm_* 関数と同様、PHP 5.1.0でPHP本体のバンドル拡張から削除されており、現行のPHPバージョンでは利用できません。本記事では、この関数の役割と、現代においてライブラリやミドルウェアのバージョンを確認する際の一般的な手法について解説します。
関数概要
| 項目 | 内容 |
|---|---|
| 関数名 | udm_api_version() |
| 所属拡張 | mnoGoSearch拡張(旧称 UdmSearch) |
| シグネチャ(当時) | udm_api_version(): int |
| 引数 | なし |
| 戻り値 | mnoGoSearch APIのバージョン番号を表す整数 |
| 対応バージョン | PHP 4.0.5〜PHP 5.0.5(PECL拡張としては別途配布) |
| 現在の状態 | PHP 5.1.0でPHP本体のバンドル拡張から削除。現行PHPでは利用不可 |
| 用途 | インストール済みのmnoGoSearch APIバージョンの確認、互換性チェック |
想定されていた使われ方(イメージ図)
PHPアプリケーション
│
│ udm_api_version() を呼び出す
▼
┌───────────────────────┐
│ サーバーにリンクされている │
│ mnoGoSearchライブラリの │
│ バージョン番号を取得 │
└───────────┬───────────┘
▼
バージョン番号をもとに機能分岐
┌─────────────────────┐
│ 例: バージョンが古い場合は │
│ 特定の高度な検索機能を無効化する │
└─────────────────────┘
ポイントは、udm_api_version() がインストールされているライブラリのバージョンに応じて処理を分岐させる、いわば「機能フラグ」的な目的で使われていたという点です。これは、現代のPHPエコシステムにおける「Composerパッケージのバージョン制約」や「extension_loaded() と phpversion() の組み合わせによる互換性チェック」に通じる考え方です。
なぜ廃止されたのか
udm_api_version() を含む udm_* 関数群の廃止理由は、これまでの記事で解説してきた背景と同様です。
- 外部ソフトウェア(mnoGoSearch)への強い依存 mnoGoSearchというC言語製の検索エンジンをサーバーに個別インストールする必要があり、PHP本体に同梱する意義が薄れていきました。
- 利用者数の減少とメンテナンス負担 利用者が限定的な拡張として、PHPコアチームのメンテナンス優先度が下がっていきました。
- 代替技術への移行 HTTP API経由で連携できるElasticsearchなどの検索エンジンが主流となり、専用のバージョン確認関数を持つ密結合な拡張の必要性が薄れました。
(参考・歴史的資料)当時の使用イメージ
以下は、udm_api_version() が実際に使われていた当時(PHP 5.0系以前)のコード例です。現行のPHPでは実行できない歴史的な参考資料としてご覧ください。
<?php
// 注意: 以下はPHP 5.0系以前でのみ動作する歴史的なコード例です
// 現行のPHP 7/8では udm_api_version() 関数自体が存在しません
if (function_exists('udm_api_version')) {
$version = udm_api_version();
echo "mnoGoSearch APIバージョン: {$version}" . PHP_EOL;
// バージョンに応じて機能を分岐させる想定の書き方
if ($version >= 30200) {
echo "高度な検索機能が利用可能です" . PHP_EOL;
} else {
echo "基本的な検索機能のみ利用可能です" . PHP_EOL;
}
} else {
echo 'mnoGoSearch拡張がインストールされていません' . PHP_EOL;
}
function_exists() による存在確認を組み合わせるのが、この関数を安全に呼び出すための一般的な作法でした。これは現代のPHP開発においても通用する、拡張機能の可用性チェックの基本パターンです。
現代における代替の考え方
「外部ライブラリやミドルウェアのバージョンを確認し、機能を分岐させる」という udm_api_version() の役割に相当する処理は、現在では以下のような形で実装されるのが一般的です。
選択肢1:Composerパッケージのバージョン制約で解決する
<?php
class SearchClientVersionChecker
{
/**
* 現代ではudm_api_version()のような実行時チェックよりも、
* composer.jsonでのバージョン制約管理が主流になっている
* (実行例: composer show elasticsearch/elasticsearch)
*/
public function getInstalledVersion(string $packageName): ?string
{
$installed = json_decode(
file_get_contents(__DIR__ . '/../vendor/composer/installed.json'),
true
);
foreach ($installed['packages'] ?? [] as $package) {
if ($package['name'] === $packageName) {
return $package['version'];
}
}
return null;
}
}
$checker = new SearchClientVersionChecker();
echo $checker->getInstalledVersion('elasticsearch/elasticsearch') . PHP_EOL;
選択肢2:検索エンジンサーバー自体のバージョンAPIを呼び出す
<?php
class ElasticsearchVersionChecker
{
public function __construct(private \Elastic\Elasticsearch\Client $client)
{
}
/**
* udm_api_version()相当の「サーバー側ライブラリのバージョン確認」を
* Elasticsearchの info API 経由で行う
*/
public function getServerVersion(): string
{
$info = $this->client->info();
return $info['version']['number'];
}
}
選択肢3:PHP拡張自体のロード状況とバージョンを確認する汎用ヘルパー
<?php
class ExtensionVersionHelper
{
/**
* 拡張がロードされているかどうかと、そのバージョンを
* 汎用的に確認するヘルパークラス
*/
public function checkExtension(string $extensionName): array
{
$loaded = extension_loaded($extensionName);
return [
'loaded' => $loaded,
'version' => $loaded ? phpversion($extensionName) : null,
];
}
}
$helper = new ExtensionVersionHelper();
print_r($helper->checkExtension('mbstring'));
print_r($helper->checkExtension('mnogosearch')); // loaded: false(現行PHPでは存在しない)
関連関数との比較(当時のmnoGoSearch関数群)
| 関数 | 役割 | 現在の状態 |
|---|---|---|
udm_api_version() | mnoGoSearch APIのバージョンを取得 | 本記事の対象。PHP 5.1.0で削除済み |
udm_alloc_agent() | 検索エージェントを生成 | 同上、削除済み(前々回記事を参照) |
udm_add_search_limit() | 検索制限を追加 | 同上、削除済み(前回記事を参照) |
udm_check_charset() | 文字セットが有効かどうかを確認 | 同上、削除済み |
phpversion() | PHP自体またはロード済み拡張のバージョンを取得 | 現在も利用可能。同種の目的を果たす現代の標準関数 |
よくある落とし穴(注意点)
- 現行のPHPでは関数自体が存在しない
Call to undefined function udm_api_version()というFatal Errorになります。古い記事のサンプルコードをそのまま動かそうとしないよう注意しましょう。 function_exists()によるチェックだけでは不十分な場合がある 歴史的なコード例のようにfunction_exists('udm_api_version')でチェックを行っていたとしても、そもそも現行のPHPには当該拡張のインストール手段自体が実質的に存在しないため、常にfalseになります。- バージョン番号の形式に一貫性がなかった 当時のmnoGoSearchのバージョン番号は、メジャー・マイナー・パッチの表現方法がライブラリによってまちまちであり、単純な数値比較だけでは正確な機能判定が難しいケースもありました。現代のセマンティックバージョニング(
composer/semverなど)を使った比較の方が堅牢です。 - 「API」という言葉から現代のREST APIを連想しない ここでの「API」は、mnoGoSearchライブラリが提供するC言語レベルの関数インターフェースのバージョンを指しており、現代のWeb APIとは異なる文脈の用語です。
- バージョン確認自体は良い設計パターンだったことを再評価する 関数自体は廃止されましたが、「外部依存ライブラリのバージョンを確認してから機能を分岐する」という設計思想自体は、現代の開発でも重要な考え方として引き継がれています。
まとめ
| 観点 | まとめ |
|---|---|
| 何をする関数だったか | インストールされているmnoGoSearch APIのバージョン番号を取得する |
| 現在の状態 | PHP 5.1.0で本体から削除。現行のPHPでは使用不可 |
| 想定されていた用途 | バージョンに応じた機能分岐、互換性チェック |
| 現代の代替の考え方 | Composerのバージョン制約、phpversion()、検索エンジンサーバーのバージョンAPI |
| 注意点 | 関数自体が存在しないこと、バージョン番号形式の非統一性、現代のAPIという用語との混同 |
udm_api_version() は非常にシンプルな関数でしたが、「外部ライブラリの互換性を実行時に確認する」という設計思想は、Composerのバージョン制約管理やセマンティックバージョニングという形で、現代のPHP開発にも脈々と受け継がれています。歴史的な関数として、その役割を理解しておくとよいでしょう。
