Извините за этот вопрос новичка, я никогда раньше не использовал серверную часть js.
вот моя проблема:
У меня есть некоторый javascript, загруженный с удаленной страницы (он зашифрован, я не могу преобразовать его в php), мне нужно выполнить его и прочитать его вывод.
Как мне это сделать? Я думаю примерно так:
shell_exec('nodejs code...')
а как передать код? Он довольно длинный, около 10 строк javascript.
Другой способ - сохранить js в файл и запустить nodejs script.js, но это будет бесполезный и медленный ввод-вывод диска ...
«загружено с удаленной страницы» - тогда он, вероятно, не предназначен для работы с Node.js и, скорее всего, выйдет из строя, потому что у него нет DOM для доступа.
@quentin Я уже тестировал, и он работает, мне нужно только немного отредактировать код, прежде чем отправлять его на узел. Но я пытаюсь с классом php V8Js



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Не знаю, я не дома с php, правда ли, что php обслуживает html-файлы для пользователя дома, так почему это должно отличаться от использования javascript-файла на обычной html-странице?
нельзя просто использовать: <script src = "myscripts.js"></script> "
или <script>"with here your script"</script>
в файл, который нужно загрузить этот javascript?
Это запустит JS на клиенте. Вопрос в том, чтобы запустить его на сервере.
Да, но OP уже сказал, что считает node JS бесполезным и медленным. Я не уверен, действительно ли OP понимает JS и Node. Он пытается выполнить JS на стороне сервера без Node, а также сделать это из файла PHP.
Я говорил о создании файла на диск, который работает медленно, а не о node.js
Важное предупреждение об использовании exec / shell_exec
Я чувствую необходимость добавить к этому ответу предостережение о безопасности. Всегда будьте осторожны при использовании exec или shell_exec. Практически всегда не следует передавать данные по сети для внедрения в команду оболочки из соображений безопасности. Запись сценария в файл намного безопаснее, поскольку отсутствует риск внедрения команды. Если вы уверены, что такой подход необходим, я вам настоятельно рекомендую.
Было сказано, что. Вот мой первоначальный ответ на заданный вопрос:
Похоже, что недостающей частью вашей головоломки является параметр -e для узла. Это позволит вам передать сценарий как часть вызова команды.
Например.
C:\Users\Cmonahan>node -e "console.info('hello world');"
hello world
Затем вы можете использовать PHP exec или оболочка exec для получения вывода.
Больше информации:
PHP shell_exec () против exec ()
Редактировать: Относительно передачи многострочных аргументов в командную строку. Это может быть чем-то вроде минного поля. Например: это зависит от того, является ли среда Unix-подобной или Windows-подобной, а затем, если Unix-подобной, какая оболочка анализирует команду.
См. Например:
Windows: Как указать многострочную команду в командной строке?
Конец строки (новая строка) экранируется в bash
Я бы рекомендовал просто убедиться, что аргумент состоит из одной строки. В случае JS вы можете сначала попробовать минификацию, которая обычно удаляет все символы новой строки, и посмотреть, работает ли это для вас.
Вот популярный минификатор на основе PHP https://github.com/mrclay/minify, я считаю, что вы сможете установить его через композитор.
Спасибо, вопрос также заключался в том, как передать многострочный скрипт в качестве аргумента оболочки, что-то вроде кодирования base64?
Я обновил свой ответ, включив в него информацию о передаче многострочных аргументов. Обычно проще убедиться, что аргумент представляет собой одну строку, поэтому я предлагаю использовать JS-минификатор. Однако я добавил несколько указателей на передачу многострочных аргументов, если вы хотите пойти именно так. Я также добавил примечание о безопасности. Это то же самое для всех, кто смотрит на ответ, но я настоятельно рекомендую вам убедиться, что вы знаете, что делаете при передаче данных в exec или shell_exec.
На самом деле - вы проверили, что exec / shell_exec действительно интерпретирует буквальный перевод строки как новую команду? Если нет, то у вас нет проблем. Я не могу найти в Интернете ничего разъясняющего, и у меня нет возможности проверить прямо сейчас.
Взгляните здесь