【问题标题】:MongoClient PHP sript run for foreverMongoClient PHP 脚本永远运行
【发布时间】:2014-02-25 12:10:19
【问题描述】:

我正在使用 PHP mongoclient 类连接 mongodb 远程主机。

我没有写什么特别简单但简单的连接代码。

$connection_url = "mongodb://{$dbuser}:{$dbpass}@{$dburl}:{$dbport}/{$dbname}";         
$this->m = new MongoClient($connection);

它确实连接到 mongodb,但一段时间后我的应用程序挂起,挂起是指 php sript 永远运行,没有响​​应,最后 apache 和我的服务器崩溃。我需要重新启动服务器才能重新启动。

为什么 PHP 脚本一直在运行而 mongoserver 没有响应。

我将max_execution_time 设置为 30 秒。

MongoClient 版本 1.4.5

更新:

正如here所解释的那样 mongodb 的默认连接和套接字超时时间是 never timeout ,我猜,如果套接字从 MongoServer 端关闭,php MongoClient 可能会永远等待。

为了确保我已将 mongoclient 的选项设置为在套接字关闭时不等待超过 5 秒,如下所示

$connection_url = "mongodb://{$dbuser}:{$dbpass}@{$dburl}:{$dbport}/{$dbname}";
$options = array('connectTimeoutMS' =>5000 , 'socketTimeoutMS' => 5000);
$this->m = new MongoClient($connection, $options);

但这仍然挂起

这里是简短的 Mongo 日志

2:4:找到连接 somehost;-;dbname/user/fd6da21ee7cf37731eb88e250d4a05d6;1957(看着 对于某些主机;-;dbname/username/fd6da21ee7cf37731eb88e250d4a05d6;1957) 2:2:mongo_get_read_write_connection:找到一个 STANDALONE 连接

2:4:找到连接 主机;-;dbname/username/fd6da21ee7cf37731eb88e250d4a05d6;1957(看着 对于主机名;-;dnname/user/fd6da21ee7cf37731eb88e250d4a05d6;1957)

2:2:is_ping: ping 主机名;-;数据库名/用户名/fd6da21ee7cf37731eb88e250d4a05d6;1957

“is_ping”之后没有日志。这意味着我的脚本挂在这里。

更新:

这是挂起时正在使用和运行的进程

ps aux | sort -rk 3,3 | head -n 20
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
www-data 32612  0.0  1.1 108372  5604 ?        S    11:05   0:00 /usr/sbin/apache2 -k start
www-data 32390  0.0  1.1 108372  5604 ?        S    11:04   0:00 /usr/sbin/apache2 -k start
www-data 32389  0.0  1.4 109192  7348 ?        S    11:00   0:00 /usr/sbin/apache2 -k start
www-data 32388  0.0  1.4 109192  7376 ?        S    11:00   0:00 /usr/sbin/apache2 -k start
www-data 32387  0.0  1.4 109192  7376 ?        S    11:00   0:00 /usr/sbin/apache2 -k start
www-data 32386  0.0  1.2 108412  6100 ?        S    11:00   0:00 /usr/sbin/apache2 -k start
www-data 32385  0.0  1.8 111692  9432 ?        S    11:00   0:00 /usr/sbin/apache2 -k start
www-data 31833  0.0  1.5 109216  7548 ?        S    02:35   0:00 /usr/sbin/apache2 -k start
www-data 31173  0.0  1.5 108824  7872 ?        S    Mar02   0:00 /usr/sbin/apache2 -k start
www-data 15538  0.0  1.5 109216  7664 ?        S    Mar02   0:00 /usr/sbin/apache2 -k start
www-data 15536  0.0  1.4 109200  7496 ?        S    Mar02   0:00 /usr/sbin/apache2 -k start
www-data 15535  0.0  1.6 110904  8444 ?        S    Mar02   0:00 /usr/sbin/apache2 -k start
www-data 15534  0.0  1.3 108684  6536 ?        S    Mar02   0:00 /usr/sbin/apache2 -k start
whoopsie   847  0.0  0.5 187668  2676 ?        Ssl  Feb24   0:00 whoopsie
syslog     370  0.0  0.6 249676  3060 ?        Sl   Feb24   0:31 rsyslogd -c5
root       984  0.0  0.1  15792   908 tty1     Ss+  Feb24   0:00 /sbin/getty -8 38400 tty1
root       946  0.0  2.0 108348 10120 ?        Ss   Feb24   0:32 /usr/sbin/apache2 -k start
root         9  0.0  0.0      0     0 ?        S    Feb24   0:00 [rcu_bh]
root       879  0.0  0.0      0     0 ?        S<   Feb24   0:00 [kvm-irqfd-clean]

【问题讨论】:

  • 我也遇到了这个错误,我正在使用 SSL,但我认为问题不在于 SSL - 它只是套接字变得陈旧。如果我找到答案,我一定会在这里为您发布。

标签: php mongodb


【解决方案1】:

听起来像是硬件问题或mongodb问题,如果有挂起的php脚本,服务器应该不需要重新启动......

但是,您可以尝试将用户名密码 db 添加到这样的选项中:

function __construct($host, $username, $password, $db){
    $this->client = new MongoClient("mongodb://" . $host, array('username' => $username, 'password' => $password, 'db' => $db));
    $this->db = $this->client->selectDB($db);
}

【讨论】:

  • 试过了。这没有任何改变。还是同样的问题。
猜你喜欢
  • 2015-04-17
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 2013-12-08
  • 2013-11-04
  • 1970-01-01
相关资源
最近更新 更多