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 устарел и больше не работает.

Solutions Collecting From Web of "PHP MongoDb: как установить тайм-аут для выполнения кода"

Вы можете установить 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 , потому что эта команда не возвращает курсор.

Вам нужна реализация команды MongoDB :: this, которая фактически принимает аргумент:

 <?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 на сервере, как это.