依存パッケージと外部統合 - ha1t/php-gm-server GitHub Wiki

依存パッケージと外部統合

本ページでは、php-gm-serverプロジェクトが使用する依存パッケージ、オートロード設定、および外部依存の最小限化に関する設計思想を説明します。本プロジェクトはPHP 8.1以上を基盤とし、ReactPHPフレームワークを中心とした最小限の外部依存設計を採用しています。詳細についてはインストール・セットアップガイドアーキテクチャ設計も参照してください。

直接的な依存パッケージ

php-gm-serverの直接的な依存パッケージはcomposer.jsonで指定されます。

主要パッケージ

PHP 8.1以上
プロジェクト全体の基盤です。declare(strict_types=1); によるストリクト型チェック、名前空間、型ヒント等の言語機能を活用した開発が行われています。

react/socket ^1.16
ReactPHPのソケット通信ライブラリです。TcpServerクラスとSecureServerクラスを使用して、Geminiプロトコルのクライアント接続を処理します。TLS/SSL暗号化通信とバッファ管理を提供します。
Sources: php-gm-server/src/GeminiServer.php:9-10php-gm-server/composer.json:7

react/event-loop ^1.5
ReactPHPのイベントループライブラリです。非同期I/O駆動の中核を構成し、Loop::get() によるシングルトンイベントループの取得、接続イベントやデータ受信イベントの非同期処理を実現します。
Sources: php-gm-server/src/GeminiServer.php:7php-gm-server/composer.json:8

推移的な依存パッケージ

react/socketとreact/event-loopは、他のReactPHPコンポーネントを推移的に依存しています。これらはプロジェクトの機能実装に直接は使用されませんが、インストール時に自動的に取得されます。

パッケージ名 バージョン 説明
evenement/evenement v3.0.2 イベント発行・リッスニングメカニズム。ReactPHPの内部で使用される。
react/promise v3.3.0 非同期操作の遅延実行。Promise/A仕様に準拠。
react/stream v1.4+ ストリーム処理ライブラリ。react/socketで使用。
react/dns v1.14.0 DNS解決ライブラリ。react/socketで使用。
react/cache v1.2.0 キャッシング機構。react/dnsで使用。

Sources: php-gm-server/composer.lock:8-400

開発依存パッケージ

PHPUnit ^10.5
ユニットテストフレームワークです。composer require --dev phpunit/phpunit により開発環境に導入されます。プロジェクトの全コンポーネント(RequestParser、ResponseBuilder、StaticFileHandler、CertificateGenerator)に対する自動テストが実装されています。テスト実行は vendor/bin/phpunit コマンドで行われます。
Sources: php-gm-server/composer.json:11php-gm-server/phpunit.xml:1-12

PSR-4オートロード設定

Composerの PSR-4 オートロード規約に従い、クラスの自動読み込みが設定されています。

本番環境のオートロード

"autoload": {
    "psr-4": {
        "GeminiServer\\": "src/"
    }
}

GeminiServer 名前空間に属するクラスは、src/ ディレクトリ配下の同名ディレクトリまたはPHPファイルから自動読み込みされます。例えば、GeminiServer\RequestParser クラスは src/RequestParser.php に対応します。
Sources: php-gm-server/composer.json:13-16

開発環境のオートロード

"autoload-dev": {
    "psr-4": {
        "GeminiServer\\Tests\\": "tests/"
    }
}

テストコードは GeminiServer\Tests 名前空間に属し、tests/ ディレクトリに配置されます。composer install --dev 実行時にこのオートロード設定が有効化されます。例えば、GeminiServer\Tests\RequestParserTest クラスは tests/RequestParserTest.php に対応します。
Sources: php-gm-server/composer.json:18-22

オートロード初期化

すべてのPHP実行時の最初に、Composerの自動生成ファイル vendor/autoload.php を読み込む必要があります。

require __DIR__ . '/../vendor/autoload.php';

このファイルは名前空間とファイルパスのマッピングテーブル、およびオートロード関数を定義しており、初期化後は new GeminiServer\RequestParser() のようなクラス参照が自動的に対応するファイルを読み込みます。
Sources: php-gm-server/bin/server.php:5

依存パッケージグラフ

graph TD
    A["php-gm-server<br/>require PHP>=8.1"] -->|直接依存| B["react/socket ^1.16"]
    A -->|直接依存| C["react/event-loop ^1.5"]
    A -->|開発依存| D["PHPUnit ^10.5"]
    
    B -->|推移的依存| E["evenement/evenement ^3.0"]
    B -->|推移的依存| F["react/dns ^1.13"]
    B -->|推移的依存| G["react/promise ^3.2"]
    B -->|推移的依存| H["react/stream ^1.4"]
    
    C -->|推移的依存| G
    
    F -->|推移的依存| I["react/cache ^1.0"]
    F -->|推移的依存| G
    
    I -->|推移的依存| G
    
    style A fill:#f0f0f0
    style B fill:#b3e5fc
    style C fill:#b3e5fc
    style D fill:#fff9c4
    style E fill:#e1bee7
    style F fill:#e1bee7
    style G fill:#e1bee7
    style H fill:#e1bee7
    style I fill:#e1bee7
Loading

オートロード構造

graph TD
    A["vendor/autoload.php<br/>Composer自動生成"] -->|初期化| B["PSR-4 マッピング"]
    B -->|GeminiServer\\| C["src/"]
    B -->|GeminiServer\\Tests\\| D["tests/"]
    
    C -->|RequestParser.php| E["GeminiServer\\RequestParser"]
    C -->|ResponseBuilder.php| F["GeminiServer\\ResponseBuilder"]
    C -->|StaticFileHandler.php| G["GeminiServer\\StaticFileHandler"]
    C -->|GeminiServer.php| H["GeminiServer\\GeminiServer"]
    C -->|CertificateGenerator.php| I["GeminiServer\\CertificateGenerator"]
    
    D -->|RequestParserTest.php| J["GeminiServer\\Tests\\RequestParserTest"]
    D -->|ResponseBuilderTest.php| K["GeminiServer\\Tests\\ResponseBuilderTest"]
    D -->|StaticFileHandlerTest.php| L["GeminiServer\\Tests\\StaticFileHandlerTest"]
    D -->|CertificateGeneratorTest.php| M["GeminiServer\\Tests\\CertificateGeneratorTest"]
    
    style A fill:#fff9c4
    style B fill:#f0f0f0
    style C fill:#c8e6c9
    style D fill:#ffccbc
Loading

最小限の外部依存設計思想

php-gm-serverは、以下の原則に基づいて外部依存を最小化した設計を採用しています。

1. ReactPHP への依存集約

非同期I/O処理と網接続管理を単一のReactPHPライブラリに統一しており、複数の非同期フレームワークの混在を回避しています。イベントループ駆動のプログラミングパターンをプロジェクト全体で一貫して適用しています。

2. 標準PHP拡張機能の活用

TLS証明書生成では、OpenSSL PHP拡張機能(openssl_pkey_new()openssl_csr_new() 等)を直接使用しており、追加のサードパーティライブラリを導入していません。プロトコル処理ではPHPの標準関数(parse_url()file_get_contents() 等)を活用しています。
Sources: php-gm-server/src/CertificateGenerator.php:28-46

3. 簡潔なビジネスロジック

RequestParser、ResponseBuilder、StaticFileHandlerなどのコンポーネントは、Geminiプロトコルの仕様に必要な最小限の機能のみを実装しており、汎用フレームワークの機能複雑性を持ちません。クラスは依存性注入パターンを採用し、テスト可能性を確保しています。
Sources: php-gm-server/src/ResponseBuilder.php:1-23php-gm-server/src/RequestParser.php:1-48

4. テスト駆動の開発

PHPUnit のみを開発依存とし、モック生成、テスト用フィクスチャ、アサーション機能など、ユニットテスト実施に必要な機能が統合されています。各コンポーネントは単位テストで検証されており、外部依存の少なさが高いテスト可能性を実現しています。
Sources: php-gm-server/tests/RequestParserTest.php:1-30php-gm-server/phpunit.xml

依存パッケージの更新戦略

composer.json に記述されたバージョン指定は、セマンティックバージョニング(SemVer)の互換性範囲を使用しています。

バージョン指定 説明
^1.16 1.16 以上 2.0 未満。マイナーバージョンの更新を許可し、メジャーバージョンの破壊的変更は排除。
^1.5 1.5 以上 2.0 未満。
^10.5 10.5 以上 11.0 未満。

composer update 実行時は、この範囲内でのみパッケージが更新されます。メジャーバージョン更新(ReactPHP 2.0など)は、開発者が明示的にcomposer.jsonを更新する必要があります。
Sources: php-gm-server/composer.json:5-12

依存パッケージの導入と検証

新しい依存パッケージ導入時は、以下の手順を推奨します。

  1. 必要性の検証:機能が既存の依存パッケージで実装可能か、標準PHPで実装可能か確認
  2. ライセンス確認:パッケージのライセンス(MIT、Apache 2.0 等)がプロジェクトと互換であることを確認
  3. セキュリティ監査composer audit によるセキュリティ脆弱性チェック
  4. バージョン選定:安定版かつ長期保守予定のバージョンを選定
  5. テスト実装:新パッケージを使用する機能のユニットテスト実装

Related Pages

⚠️ **GitHub.com Fallback** ⚠️