Драйвер PHP MongoDB: как установить время ожидания для выполнения кода

#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 на сервере подобным образом.