5

私の開発チームは、ローカル開発環境からリモートの MongoDB データベースにアクセスする際に問題を抱えています。

リモートの Ubuntu 開発サーバーは、PHP 5.3 用に構築された mongo-php-driver v1.3.7 を使用して、MongoDB および PHP 5.3 の最新の v2.4.3 を実行しています。mongodb.conf基本的なパスのセットアップを除いて、ほとんど空です。現在、シャードまたはレプリカ セットはありません。

すべてのチーム メンバーは OSX 10.8、PHP 5.3 を使用しており、PHP 5.3 用にビルドされた mongo-php-driver v1.3.7 を使用しています。一部のチーム メンバーは XAMPP を使用し、他のメンバーは組み込みの OSX AMP スタックを使用しています。すべての主要なデスクトップ ブラウザーでテストを行います。

ページが Mongo からデータを取得する必要があるときはいつでも、この接続関数を呼び出すことから始めます。

public static function connect($server, $db)
{
    $connection = new MongoClient(
        "mongodb://{$server}:27017", 
        array(
            "connectTimeoutMS" => 20000, 
            "socketTimeoutMS" => 20000
        )
    );

    return $connection->$db;
}

ただし、ページ読み込みの約 30% で次のエラーが発生しています。

Failed to connect to: www.development-server.com:27017: send_package: error reading from socket: Timed out waiting for header data

これらのエラーの大部分は、新しいページに移動するのではなく、ページを更新するときに発生するようですが、それは事実というよりも推測です. みんなのphp.iniファイルをチェックして、default_socket_timeout = 60設定されていることを確認しました。

開発サーバーもサイトのコピーをホストしていますが、そこに到達するために localhost を呼び出しているだけなので、エラーをスローしたことはありません。MongoDB をローカルにインストールすると、エラーもなくなりました。

これは実際にはタイムアウトの問題のようですが、有効期限を調整するためのその他の設定、パラメーター、または構成が見つかりません。いずれかがあります?

4

3 に答える 3

1

@hernan_arg からの返信で、別の可能性について考えさせられました。成功するために 1 回限りの接続試行 (永遠にかかるようです) に依存する代わりに、成功するまで接続をループに固定することは許容されますか?

public static function connect($server, $db)
{
    $connection = null;

    try {
        $connection = new MongoClient("mongodb://{$server}");
    } catch (MongoConnectionException $e) {
        return self::connect();
        exit;
    }

    return $connection->$db;
}

ロギングは、接続が失敗するとすぐに失敗し、ループが無限タイムアウトよりもはるかにタイムリーに新しい接続を確立することを示します。データベースに到達できなくなったと仮定すると、最終的にプロセスを強制終了するために PHP 実行タイムアウトに頼ることができると思います。

于 2013-05-21T13:46:17.557 に答える
0

ポートを接続または設定せずに接続してみてください

array( "connectTimeoutMS" => -1, "socketTimeoutMS" => -1 )

(無限タイムアウト)

于 2013-05-17T21:05:32.247 に答える