Я подключаюсь к удаленному хосту mongodb с классом PHP mongoclient.
Я не написал ничего простого, но простого кода подключения.
$connection_url = "mongodb://{$dbuser}:{$dbpass}@{$dburl}:{$dbport}/{$dbname}";
$this->m = new MongoClient($connection);
Он подключается к mongodb, но через некоторое время мое приложение зависает. По зависанию я подразумеваю запуск php sript навсегда, никакого ответа и, наконец, apache и моего сервера. Мне нужно перезагрузить свой сервер, чтобы он снова появился.
Почему PHP script работает навсегда, а mongoserver не отвечает.
У меня max_execution_time
установлено значение 30 секунд.
Версия MongoClient 1.4.5
Обновление:
Как объяснено здесь По умолчанию соединение и время ожидания сокета из mongodb никогда не время ожидания, я думаю, может быть php MongoClient ждет навсегда, если сокет закрыт со стороны MongoServer.
Чтобы убедиться, что у меня установлены параметры для mongoclient, чтобы не ждать более 5 секунд, если сокет закрыт, например ниже
$connection_url = "mongodb://{$dbuser}:{$dbpass}@{$dburl}:{$dbport}/{$dbname}";
$options = array('connectTimeoutMS' =>5000 , 'socketTimeoutMS' => 5000);
$this->m = new MongoClient($connection, $options);
Но это все еще висит
Вот короткий Mongo Log
2: 4: найдено соединение somehost; -; dbname/user/fd6da21ee7cf37731eb88e250d4a05d6; 1957 (ищет для somehost; -; dbname/username/fd6da21ee7cf37731eb88e250d4a05d6; 1957) 2: 2: mongo_get_read_write_connection: поиск соединения STANDALONE
2: 4: найдено соединение host; -; dbname/username/fd6da21ee7cf37731eb88e250d4a05d6; 1957 (ищет для имени хоста; -; dnname/user/fd6da21ee7cf37731eb88e250d4a05d6; 1957)
2: 2: is_ping: pinging имя хоста; -; имя_бд/имя пользователя /fd 6da21ee7cf37731eb88e250d4a05d6, 1957
Нет журнала после 'is_ping'. Это означает, что мой script висит здесь.
Update:
Вот какие процессы используются и работают, когда он висит
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]
звучит как проблема с оборудованием или проблема 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);
}