Как передать содержимое переменной через внешнюю команду в php?

StackOverflow https://stackoverflow.com/questions/7331527

  •  27-10-2019
  •  | 
  •  

Вопрос

У меня есть переменная, содержащая длинную строку. (в частности, он содержит несколько килобайт javascript-кода)

Я хочу передать эту строку через внешнюю команду, в данном случае компрессор javascript, и записать вывод внешней команды (сжатый javascript) в php, назначив его переменной.

Я знаю, что в php есть классы для сжатия javascript, но это всего лишь один пример общей проблемы.

изначально мы использовали:

родовое слово

Это работает для небольших строк, но небезопасно. (если oldvar содержит символы со специальным значением для оболочки, может случиться что угодно)

Экранирование с помощью escapeshellarg исправляет это, но решение ломается для более длинных строк из-за ограничений ОС на максимально допустимую длину аргумента.

Я пробовал использовать popen("command" "w") и писать в команду - это работает, но вывод команды незаметно исчезает в пустоте.

По идее, я просто хочу сделать эквивалент:

родовое слово
Это было полезно?

Решение

Используя функцию proc_open , вы можете получить дескрипторы для обоих stdoutи stdin процесса, записывая в него свои данные и считывая результат.

Другие советы

Используя предложение Rumpels, мне удалось создать следующее решение, которое, похоже, работает хорошо.Разместите его здесь для всех, кто интересуется вопросом.

родовое слово

Могут возникнуть проблемы с взаимоблокировкой: если данные, которые вы отправляете, больше, чем объединенные размеры каналов, тогда внешняя команда будет заблокирована, ожидая, пока кто-то прочитает ее stdout, в то время как php заблокирован, ожидая stdin длячитать, чтобы освободить место для дополнительных сведений.

Возможно, PHP каким-то образом решит эту проблему, но стоит проверить, планируете ли вы отправлять (или получать) больше данных, чем умещается в конвейерах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top