依存パッケージと外部統合 - 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-10、php-gm-server/composer.json:7
react/event-loop ^1.5
ReactPHPのイベントループライブラリです。非同期I/O駆動の中核を構成し、Loop::get() によるシングルトンイベントループの取得、接続イベントやデータ受信イベントの非同期処理を実現します。
Sources: php-gm-server/src/GeminiServer.php:7、php-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:11、php-gm-server/phpunit.xml:1-12
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
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
php-gm-serverは、以下の原則に基づいて外部依存を最小化した設計を採用しています。
非同期I/O処理と網接続管理を単一のReactPHPライブラリに統一しており、複数の非同期フレームワークの混在を回避しています。イベントループ駆動のプログラミングパターンをプロジェクト全体で一貫して適用しています。
TLS証明書生成では、OpenSSL PHP拡張機能(openssl_pkey_new()、openssl_csr_new() 等)を直接使用しており、追加のサードパーティライブラリを導入していません。プロトコル処理ではPHPの標準関数(parse_url()、file_get_contents() 等)を活用しています。
Sources: php-gm-server/src/CertificateGenerator.php:28-46
RequestParser、ResponseBuilder、StaticFileHandlerなどのコンポーネントは、Geminiプロトコルの仕様に必要な最小限の機能のみを実装しており、汎用フレームワークの機能複雑性を持ちません。クラスは依存性注入パターンを採用し、テスト可能性を確保しています。
Sources: php-gm-server/src/ResponseBuilder.php:1-23、php-gm-server/src/RequestParser.php:1-48
PHPUnit のみを開発依存とし、モック生成、テスト用フィクスチャ、アサーション機能など、ユニットテスト実施に必要な機能が統合されています。各コンポーネントは単位テストで検証されており、外部依存の少なさが高いテスト可能性を実現しています。
Sources: php-gm-server/tests/RequestParserTest.php:1-30、php-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
新しい依存パッケージ導入時は、以下の手順を推奨します。
- 必要性の検証:機能が既存の依存パッケージで実装可能か、標準PHPで実装可能か確認
- ライセンス確認:パッケージのライセンス(MIT、Apache 2.0 等)がプロジェクトと互換であることを確認
-
セキュリティ監査:
composer auditによるセキュリティ脆弱性チェック - バージョン選定:安定版かつ長期保守予定のバージョンを選定
- テスト実装:新パッケージを使用する機能のユニットテスト実装
- インストール・セットアップガイド — Composerでの依存パッケージ導入手順
- アーキテクチャ設計 — ReactPHPベースのイベントループ駆動設計
- テスト戦略と実装 — PHPUnitによるテスト実装の詳細
- プロジェクト概要 — プロジェクト全体の目的と技術スタック
- GeminiServerコンポーネント — React/Socketの使用例