У меня есть следующий код, который выполняет часть кода на стороне 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 устарел и больше не работает.
Вы можете установить 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 на сервере, как это.