Как передать большие объемы данных в аргументы командной строки (argv)?

Как можно передать большие данные в скрипт Node.js, который будет запускаться с помощью shell_exec PHP?

У меня есть скрипт рендеринга SSR, который скомпилирован из Vue файла. Я планирую запускать его из PHP с помощью shell_exec и передавать ему JSON данные.

В данный момент я передаю данные в командной строке вместе с запуском команды "node render.js [большие JSON данные]".

Однако, я сталкиваюсь с проблемой усечения данных в Node.js при передаче их таким образом. Как можно передать большие данные в этот Node.js скрипт?
  • 19 октября 2023 г. 12:18
Ответы на вопрос 1
Когда объем данных, передаваемых в аргументы командной строки, становится слишком большим, может возникать ограничение на длину команды операционной системы. В таких случаях можно использовать альтернативные способы передачи данных, например:

1. Чтение данных из стандартного ввода (stdin): Вместо передачи данных в аргументах командной строки, вы можете использовать стандартный ввод в своем Node.js скрипте, чтобы прочитать данные извне. В PHP вы можете написать данные во входной поток с помощью функции `fwrite`, и в Node.js скрипте вы можете прочитать их из `process.stdin`.

   В PHP:
   ```php
   $json = json_encode($data);
   $command = "echo '" . $json . "' | node render.js";
   $output = shell_exec($command);
   ```

   В Node.js:
   ```js
   process.stdin.resume();
   process.stdin.setEncoding('utf8');

   let data = '';
   process.stdin.on('data', chunk => {
     data += chunk;
   });

   process.stdin.on('end', () => {
     // Обрабатываем прочитанные данные
     const jsonData = JSON.parse(data);

     // Ваш код здесь
   });
   ```

2. Хранение данных во временном файле: В PHP вы можете сохранить данные во временном файле, а затем передать путь к этому файлу в аргументе командной строки. В Node.js скрипте вы можете прочитать данные из этого файла.

   В PHP:
   ```php
   $filePath = tempnam(sys_get_temp_dir(), 'data_');
   file_put_contents($filePath, json_encode($data));
   $command = "node render.js " . $filePath;
   $output = shell_exec($command);
   ```

   В Node.js:
   ```js
   const fs = require('fs');

   const filePath = process.argv[2];
   const data = JSON.parse(fs.readFileSync(filePath, 'utf8'));

   // Ваш код здесь

   // Удаление временного файла после использования
   fs.unlinkSync(filePath);
   ```

Оба способа позволяют передать большие объемы данных без ограничений на длину команды операционной системы. Выбор между ними зависит от особенностей вашей задачи и окружения, в котором вы работаете.
Похожие вопросы