Как передать содержимое переменной через внешнюю команду в php?
Вопрос
У меня есть переменная, содержащая длинную строку. (в частности, он содержит несколько килобайт javascript-кода)
Я хочу передать эту строку через внешнюю команду, в данном случае компрессор javascript, и записать вывод внешней команды (сжатый javascript) в php, назначив его переменной.
Я знаю, что в php есть классы для сжатия javascript, но это всего лишь один пример общей проблемы.
изначально мы использовали:
родовое словоЭто работает для небольших строк, но небезопасно. (если oldvar содержит символы со специальным значением для оболочки, может случиться что угодно)
Экранирование с помощью escapeshellarg исправляет это, но решение ломается для более длинных строк из-за ограничений ОС на максимально допустимую длину аргумента.
Я пробовал использовать popen("command" "w")
и писать в команду - это работает, но вывод команды незаметно исчезает в пустоте.
По идее, я просто хочу сделать эквивалент:
родовое словоРешение
Используя функцию proc_open , вы можете получить дескрипторы для обоих stdoutи stdin процесса, записывая в него свои данные и считывая результат.
Другие советы
Используя предложение Rumpels, мне удалось создать следующее решение, которое, похоже, работает хорошо.Разместите его здесь для всех, кто интересуется вопросом.
родовое словоМогут возникнуть проблемы с взаимоблокировкой: если данные, которые вы отправляете, больше, чем объединенные размеры каналов, тогда внешняя команда будет заблокирована, ожидая, пока кто-то прочитает ее stdout, в то время как php заблокирован, ожидая stdin длячитать, чтобы освободить место для дополнительных сведений.
Возможно, PHP каким-то образом решит эту проблему, но стоит проверить, планируете ли вы отправлять (или получать) больше данных, чем умещается в конвейерах.