よくある質問
項目一覧
よくある拡張機能のインストールエラー
PHP ヘッダーが見つかりません
以下に例を挙げます。
/private/tmp/pear/install/mongodb/php_phongo.c:24:10: fatal error: 'php.h' file not found #include <php.h> ^~~~~~~
このエラーは PHP のビルド システムが必要なヘッダーを見つけられないことを示します。 すべての PHP 拡張機能は、コンパイルするために ヘッダーが必要です。 さらに、それらのヘッダーは、拡張機能が使用される PHP ランタイムに対応している必要があります。 通常、 phpize
コマンド( pecl
によって呼び出される)を使用すると、拡張機能が正しいヘッダーでビルドされるようになります。
PHP ランタイムが存在するだけでは、ヘッダーが使用可能ではないことに注意してください。 のさまざまな Linux ディストリビューションでは、ヘッダーは多くの場合、別のphp-dev
またはphp-devel
パッケージで公開されます。 macOS では、デフォルトの PHP ランタイムに ヘッダーは含まれておらず、ユーザーは通常、 Homebrew 経由で PHP(および ヘッダー)をインストールする必要があります。 拡張機能を構築するため。
複数の PHP ランタイムがインストール
システムに複数のバージョンの PHP がインストールされている場合、各バージョンには独自のpecl
phpize
コマンドと コマンドが使用されます。さらに、各 PHP ランタイムには各 SAPI ごとに個別のphp.ini
ファイルが含まれる場合があります(例: FPM、CLI)。 拡張機能がインストールされたが実行時に使用できない場合は、正しいpecl
コマンドを使用しており、適切なphp.ini
ファイルを変更していることを再確認してください。
ファイルが PHP ランタイムによって使用されているかどうかに 不明 な点がある場合は、管理する必要があります その特定のphp.ini
SAPI 向け。さらに、 html_in_loaded_file() および PH_in_scaned_files() は、どの INI ファイルが PHP によってロードされたかを正確に判断するために使用される場合があります。
拡張機能がロードされない問題をデバッグするには、ツール ディレクトリで提供されているdetect-extension
スクリプトを使用できます。 このスクリプトは CLI から実行することも、ウェブ サーバーからアクセス可能なスクリプトに含めることもできます。 このツールは、システムの潜在的な問題とインストール手順を示します。 Composer 経由でライブラリをインストールした 場合、ベンダー ディレクトリからスクリプトを呼び出せます。
php vendor/mongodb/mongodb/tools/detect-extension.php
Web サーバー SAPI の構成を確認するには、Web サーバーからアクセス可能なスクリプトに ファイルを含め、ブラウザで開きます。 出力のフォーマットを適切にフォーマットするには、必ずスクリプトを<pre>
タグで囲みます。
<pre>require(...); </pre>
Windows への互換性のない DDL のロード
Windowsバイナリは、 PHPバージョン、スレッドセーフ( Typescriptまたは NTS)、アーキテクチャ(x86 または x64)のさまざまな組み合わせで利用できます。 正しいバイナリを選択しないと、実行時に拡張機能 DDL をロードしようとしたときにエラーが発生します。
PHP Warning: PHP Startup: Unable to load dynamic library 'mongodb'
次の PHP ランタイム プロパティに対応するDLL をダウンロードしたことを確認してください。
PHP バージョン(
PHP_VERSION
)スレッドの安全性(
PHP_ZTS
)アーキテクチャ(
PHP_INT_SIZE
)
前述の定数に加えて、これらのプロパティは cfinfo() から推論することもできます 。システムに複数の PHP ランタイムがインストールされている場合は、正しい環境のphpinfo()
出力を検査していることを再確認してください。
前述のdetect-extension
スクリプトを使用して、PHP 環境に適した DDL を決定することもできます。
接続処理と永続性
MongoDBデプロイへの接続は、libmongoc
ライブラリとPHP拡張機能 によって処理されます。MongoDB\Client
インスタンスを構築すると、 PHPライブラリは同じ接続文字列とオプションを使用してMongoDB $ Driver\Managerインスタンスを作成します。拡張機能は、永続的な クライアントのハッシュキーを生成するためにもこれらのコンストラクター引数を使用します。以前にキーを使用して クライアントを永続化した場合、これは再利用されます。それ以外の場合、新しいlibmongoc
libmongoc
libmongoc
クライアントが作成され、 PHPワーカー プロセスの有効期間にわたって永続化されます。このプロセスの詳細については、 PHP拡張ドキュメント を参照してください。
各 libmongoc
クライアントは、 MongoDBデプロイへの独自の接続と、そのトポロジーのビューを維持します。永続的な libmongoc
クライアントを再利用すると、 PHPライブラリは新しい接続を確立し、トポロジーを再検出する のオーバーヘッドを回避できます。このアプローチによりパフォーマンスが向上することがほとんどで、これはドライバーのデフォルトの動作です。
永続的な libmongoc
クライアントは、 PHPワーカー プロセスが終了するまで解放されません。つまり、MongoDB\Driver\Manager
オブジェクトが範囲外になった後もMongoDBデプロイへの接続が開いたままになる可能性があります。これは通常、1 つのMongoDBデプロイに接続するアプリケーションには問題ありませんが、次のリストに記載されている状況によっては問題が発生する可能性があります。
PHP-FPM は
pm.max_requests=0
で構成されているため、ワーカーは再生成されず、 PHPアプリケーションはMongoDBの接続文字列やオプションに小さな変更を加えて繰り返し配置されます。これにより、各ワーカー プロセスにlibmongoc
クライアントオブジェクトが蓄積される可能性があります。アプリケーションは、リクエストレイテンシが最も重要ではないバックエンドコンポーネント内の別のMongoDBデプロイに時々接続します。
最初の場合、アプリケーション配置の一部としてPHP -FPM を再起動すると、アプリケーションは未使用の libmongoc
クライアントを解放し、最新の接続文字列に永続的なクライアントを引き続き使用できます。
2 番目のケースでは別のソリューションが必要になります。 disableClientPersistence
ドライバー オプションに true
を指定すると、 PHPライブラリは新しい libmongoc
クライアントを作成し、対応する MongoDB\Driver\Manager
が範囲外になったときに解放されるようにします。
次のコードは、クライアントを作成するときに disableClientPersistence
オプションを true
に設定する方法を示しています。
$client = new MongoDB\Client( uri: getenv('MONGODB_URI') ?: 'mongodb://127.0.0.1/', uriOptions: [], driverOptions: ['disableClientPersistence' => true], );
クライアント永続性をオプトアウトすると、 MongoDBデプロイへの接続を確立し、そのトポロジーを検出するのにより長い時間が必要になるため、慎重な検討を行った後に disableClientPersistence
ドライバー オプションを使用します。
サーバー選択の失敗
以下は、サーバー選択の失敗のすべての例えです。
No suitable servers found (`serverSelectionTryOnce` set): [connection refused calling hello on 'a.example.com:27017'] [connection refused calling hello on 'b.example.com:27017'] No suitable servers found: `serverSelectionTimeoutMS` expired: [socket timeout calling hello on 'example.com:27017'] No suitable servers found: `serverSelectionTimeoutMS` expired: [connection timeout calling hello on 'a.example.com:27017'] [connection timeout calling hello on 'b.example.com:27017'] [TLS handshake failed: -9806 calling hello on 'c.example.com:27017'] No suitable servers found: `serverselectiontimeoutms` timed out: [TLS handshake failed: certificate verify failed (64): IP address mismatch calling hello on 'a.example.com:27017'] [TLS handshake failed: certificate verify failed (64): IP address mismatch calling hello on 'b.example.com:27017']
これらのエラーは通常、 MongoDB\Driver\Exception\ConnectionTimeoutException として明示されます 拡張機能からの例外。実際の例外メッセージは、拡張機能で使用される基礎のシステム ライブラリである libmongoc から送信されます。 これらのメッセージはさまざまな形式になるため、アプリケーションのエラーをより適切に診断できるようにメッセージの構造を分析すると便利です。
メッセージは通常、「適切なサーバーが見つかりません」で始まります。 メッセージの次の部分は、サーバー選択がどのように失敗したかを示しています。 デフォルトでは、拡張機能はサーバー選択ループを回避し、代わりに 1 回の試行を行います( serverSelectionTryOnce
接続stringオプションに従って)。 拡張機能がループを使用するように構成されている場合、"serverSelectionTimeoutMS expired" のようなメッセージは、時間制限を使い果たしたを示します。
メッセージの最後のコンポーネントは、サーバー選択が失敗した理由を示しており、各ホストへの接続と監視を担当するサービスであるトポロジー スキャナーから直接の 1 つ以上のエラーが含まれています。 モニタリング中に最後にエラーが発生したホストがこのリストに含まれます。 これらのメッセージは通常、低レベルのソケットまたは TLS 関数から送信されます。
以下はすべてを網羅するものではありませんが、サーバー選択の失敗の原因を分析する際に正しい方向に進むことを目的としています。
「接続を拒否した」は、リモート ホストが期待されるポートでリッスンしていないことを示している可能性があります。
" connection timeout" は、ルーティングやファイアウォールの問題、レイテンシによるタイムアウトを示している可能性があります。
"socket timeout" は、ある時点で接続が確立されたが、レイテンシにより切断されるかタイムアウトされた」ことを示します。
「TLS ハンドシェイクが失敗しました」は、TLS または OCSP 検証に関連するものであることを提案し、TLS 証明書の構成に誤りがあることを示すものです。
接続が失敗した場合は、 connect
ツールを使用して詳細情報を受け取り、試行できます。 このツールは、ソケット関数を使用して接続string内の各ホストに接続し、接続を確立、データの送信、受信ができるかどうかを確認します。 このツールは、 配置への接続string MongoDBを唯一の引数として受け取ります。Composer を介してライブラリをインストールした 場合、ベンダー ディレクトリからスクリプトを呼び出します。
php vendor/mongodb/mongodb/tools/connect.php mongodb://127.0.0.1:27017
サーバーが接続を受け入れない場合、出力は次のようになります。
Looking up MongoDB at mongodb://127.0.0.1:27017 Found 1 host(s) in the URI. Will attempt to connect to each. Could not connect to 127.0.0.1:27017: Connection refused
注意
このツールはmongodb://
URI スキーマのみをサポートしています。 mongodb+srv
スキームの使用はサポートされていません。