#php #mongodb
#php #mongodb
Вопрос:
У меня есть следующий код, который выполняет фрагмент кода на стороне MongoDB:
$mongoCode = new MongoCode('/* Some JS code */');
$db->execute($mongoCode, array(
'socketTimeoutMS' => 1000000,
));
Как вы видите, я попытался установить тайм-аут для выполнения кода, установив socketTimeoutMS
значение во втором параметре execute()
функции. Но это не работает. Документация на веб-сайте PHP указывает, что второй параметр команды execute() отправляется в код в качестве аргументов.
Как я могу установить тайм-аут для MongoDB::execute()
? Пожалуйста, обратите внимание, что я использую версию 1.5 драйвера MongoDB для php, а MongoCursor::$timeout устарел и больше не работает.
Ответ №1:
Вы можете установить socketTimeoutMS
на MongoClient:
$mongo = new MongoClient("mongodb://localhost:27017",
array(
"socketTimeoutMS" => 100000
)
);
args
Параметры execute
метода передаются в код, а не в драйвер.
Вы также можете установить тайм-аут только при выполнении команды:
$result = $mongo->dbname->command(
['eval' => $code],
['socketTimeoutMS' => 1]
);
В качестве альтернативы, если вы не выполняете команды, вы можете установить время ожидания для курсора:
$cursor = $collection->find([]);
$cursor->timeout(10000);
Очевидно, что это не сработает с execute
командой, потому что эта команда не возвращает курсор.
Ответ №2:
Для этого вам нужна реализация MongoDB::command, которая фактически принимает аргумент:
<?php
$mongo = new MongoClient('mongodb://192.168.2.3/test');
$db = $mongo->test;
$code = new MongoCode( 'sleep(100); return "hello";' );
try {
$res = $db->command(
array("eval" => $code),
array( 'socketTimeoutMS' => 1 )
);
echo var_dump( $res );
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "n";
}
?>
Обратите внимание, что даже если для тайм-аута будет сгенерировано исключение, это фактически не останавливает выполнение кода на сервере. С этим вам придется справиться самостоятельно.
Изучите методы killOp()
и currentOP()
, с их использованием и реализацией, чтобы найти способ контролировать и процессы, оставшиеся запущенными после истечения вашего тайм-аута в этой операции.
Действительно попробуйте поискать другие подходы, а не выполнять JavaScript на сервере подобным образом.