5

我的开发团队无法从本地开发环境访问远程 MongoDB 数据库。

远程 Ubuntu 开发服务器正在运行最新的 MongoDB v2.4.3 和 PHP 5.3 以及为 PHP 5.3 构建的 mongo-php-driver v1.3.7。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 的回复让我想到了另一种可能性。与其依赖唯一的连接尝试成功(这似乎需要永远),是否可以将连接保持在一个循环中直到它成功?

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 回答
0

驱动程序的 1.4.1 版本解决了不稳定网络上的一些稳定性问题。

假设您正在与副本集通信,驱动程序将丢弃运行速度过慢的服务器 - 而不是重新尝试连接它们,驱动程序现在会将其列入黑名单几秒钟,而不会在连接时抛出这些异常(假设我们可以连接到至少一个服务器)

于 2013-06-10T21:05:39.003 回答