У меня есть сценарий, который использует passthru () для запуска команды. Мне нужно установить некоторые переменные среды оболочки перед запуском этой команды, иначе она не сможет найти ее библиотеки.
Я пробовал следующее:
putenv("LD_LIBRARY_PATH=/path/to/lib"); passthru($cmd);
Использование putenv () не распространяется на команду, которую я запускаю. Он не говорит, что не может найти его в библиотеках. Когда я запускаю export LD_LIBRARY_PATH=/path/to/lib
в bash, он отлично работает.
Я также попробовал следующее (зря):
exec("export LD_LIBRARY_PATH=/path/to/lib"); passthru($cmd);
Как установить переменную оболочки из PHP, которая распространяется на дочерние процессы моего PHP-скрипта?
Ограничен ли я проверкой, не существует ли переменной в текущей среде, и попросить пользователя вручную установить ее?
Я не на 100% знаком с тем, как работает exec PHP, но вы пробовали: exec("LD_LIBRARY_PATH=/path/to/lib $cmd")
Я знаю, что это работает в большинстве оболочек, но я не уверен, как PHP что-то делает.
EDIT: Предполагая, что это работает, для работы с несколькими переменными просто отделяйте их пробелом:
exec("VAR1=val1 VAR2=val2 LD_LIBRARY_PATH=/path/to/lib $cmd")
Вы могли бы просто добавить свои переменные назначения в $ cmd.
[ghoti@pc ~]$ cat doit.php <?php $cmd='echo "output=$FOO/$BAR"'; $cmd="FOO=bar;BAR=baz;" . $cmd; print ">> $cmd\n"; passthru($cmd); [ghoti@pc ~]$ php doit.php >> FOO=bar;BAR=baz;echo "output=$FOO/$BAR" output=bar/baz [ghoti@pc ~]$
На ум приходит пара вещей. Один из них – $ cmd, чтобы быть скриптом, который включает настройку переменных среды перед запуском реальной программы.
Другая мысль такова: я знаю, что вы можете определить переменную и запустить программу в одной строке, например:
DISPLAY=host:0.0 xclock
но я не знаю, работает ли это в контексте passthru