Я запускаю приложение php на сервере apache. Из приложения php мне нужно запустить скрипт ruby в командной строке. Я проверил, что запуск скрипта напрямую из терминала как user
, работает правильно. Локальная среда ruby для user
настраивается путем установки переменной path и источника, /home/user/.rvm/scripts/rvm
что позволяет скрипту загружать требования с помощью require
операторов.
Теперь через приложение php скрипт терпит неудачу в этих операторах require, и я предполагаю, что это происходит из-за того, что для пользователя не настроена среда ruby www-data
. Я никогда раньше не использовал ruby и не уверен, как правильно настроить эту среду
решение1
Я смог разобраться. Я разместил ответ на свой вопрос на SO. Надеюсь, это поможет!
https://stackoverflow.com/a/40224414/1672458
Я смог это выяснить. Во-первых, яустановленный рвмкак многопользовательскую установку, чтобы гарантировать
www-data
доступ к учетной записи.$ curl -sSL https://get.rvm.io | sudo bash -s stable
Установите нужную версию Ruby, в моем случае 2.3.1, затем настройте rvm на ее использование:
$ rvm install 2.3.1 $ rvm use 2.3.1
Запустите
gem
, чтобы установить все необходимые gems. Поскольку rvm — многопользовательская установка, эти gems хранятся в системе, а не у вашего конкретного пользователя.$ gem install packagename
Не знаю, необходимо ли это, но я бы закрыл сеанс SSH и открыл его заново. rvm портит переменные среды, так что лучше перестраховаться, чем потом сожалеть.
Запустите
env
, чтобы вывести все переменные окружения.printenv
также работает, еслиenv
по какой-то причине не работает. Вы получите большой список всего установленного, вам нужны только те, которые связаны с Ruby.Не копируйте/не вставляйте эти значения, это примеры, которые я взял из своей системы. У вас они будут другими!PATH=/usr/local/rvm/gems/ruby-2.3.1/bin:/usr/local/rvm/gems/ruby-2.3.1@global/bin:/usr/local/rvm/rubies/ruby-2.3.1/bin:/usr/local/rvm/bin:/home/steven/bin:/home/steven/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin rvm_bin_path=/usr/local/rvm/bin GEM_HOME=/usr/local/rvm/gems/ruby-2.3.1 IRBRC=/usr/local/rvm/rubies/ruby-2.3.1/.irbrc MY_RUBY_HOME=/usr/local/rvm/rubies/ruby-2.3.1 rvm_path=/usr/local/rvm rvm_prefix=/usr/local rvm_ruby_string=ruby-2.3.1 GEM_PATH=/usr/local/rvm/gems/ruby-2.3.1:/usr/local/rvm/gems/ruby-2.3.1@global RUBY_VERSION=ruby-2.3.1
Теперь нам нужно, чтобы PHP распознал эти переменные. Вам нужно будет найти нужный файл в вашей системе, что может быть сложно. У меня нет способа узнать, какой из них правильный, я использовал метод проб и ошибок.
Файл в моей системе —
/etc/php/5.6/fpm/pool.d/www.conf
. Добавить всепеременных окружения, которые вы ранее захватили в этот файл с форматом ниже. Обратите внимание, что вамPATH
также НУЖНО здесь!env[rvm_path] = /usr/local/rvm env[rvm_prefix] = /usr/local
Теперь перезагрузите
php-fpm
. Имя вашей службы может отличаться от моего; я использую сборку 5.6 от ондржей/php.Ubuntu 15.04 и новее (systemd):
$ sudo systemctl restart php5.6-fpm
Ubuntu 14.10 и новее:
$ sudo service php5.6-fpm restart
Наконец, в самом скрипте вам нужно будет
cd
указать каталог,bundle
из которого вы запускаете команду. Мой короткий скрипт такой:cd /opt/slate /usr/bin/git reset --hard /usr/bin/git pull bundle exec middleman build --clean cp -R /opt/slate/build/* /var/www/docs
Работает для меня!