Ich führe eine PHP-Anwendung auf einem Apache-Server aus. Von der PHP-Anwendung aus muss ich ein Ruby-Skript auf der Befehlszeile ausführen. Ich habe überprüft, dass das Ausführen des Skripts direkt von einem Terminal aus user
ordnungsgemäß funktioniert. Die lokale Ruby-Umgebung user
wird durch Festlegen einer Pfadvariable und einer Quelle eingerichtet, /home/user/.rvm/scripts/rvm
die es dem Skript ermöglicht, die Anforderungen mit Anweisungen zu laden require
.
Nun schlägt das Skript über die PHP-Anwendung bei diesen require-Anweisungen fehl und ich nehme an, dass dies daran liegt, dass keine Ruby-Umgebung für den www-data
Benutzer eingerichtet ist. Ich habe Ruby noch nie zuvor verwendet und bin mir nicht sicher, wie ich diese Umgebung richtig einrichten kann.
Antwort1
Ich konnte das herausfinden. Ich habe die Antwort auf meine Frage auf SO gepostet. Hoffe, es hilft!
https://stackoverflow.com/a/40224414/1672458
Ich konnte das herausfinden. Zuerst habe ichRVM installiertals Mehrbenutzerinstallation, um sicherzustellen, dass das
www-data
Konto darauf zugreifen kann.$ curl -sSL https://get.rvm.io | sudo bash -s stable
Installieren Sie die gewünschte Ruby-Version, in meinem Fall 2.3.1, und richten Sie dann rvm für die Verwendung ein:
$ rvm install 2.3.1 $ rvm use 2.3.1
Führen Sie es aus
gem
, um alle benötigten Gems zu installieren. Da RVM eine Mehrbenutzerinstallation ist, werden diese Gems im System und nicht bei Ihrem spezifischen Benutzer gespeichert.$ gem install packagename
Ich weiß nicht, ob das notwendig ist, aber ich würde die SSH-Sitzung schließen und erneut öffnen. RVM manipuliert Umgebungsvariablen, also ist Vorsicht besser als Nachsicht.
Ausführen
env
, um alle Umgebungsvariablen zu drucken.printenv
Funktioniert auch, wennenv
es aus irgendeinem Grund nicht funktioniert. Sie erhalten eine große Liste aller festgelegten Variablen, Sie benötigen nur die Ruby-bezogenen Variablen.Kopieren/fügen Sie diese Werte nicht ein. Es sind Beispiele, die ich aus meinem System gezogen habe. Ihre Werte werden anders sein!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
Jetzt brauchen wir PHP, um diese Variablen zu erkennen. Sie müssen die richtige Datei auf Ihrem System finden, was schwierig sein kann. Ich habe keine Möglichkeit herauszufinden, welche die richtige ist, ich habe es mit Ausprobieren versucht.
Die Datei auf meinem System ist
/etc/php/5.6/fpm/pool.d/www.conf
. Add alleder Umgebungsvariablen, die Sie zuvor in diese Datei mit dem folgenden Format übernommen haben. Beachten Sie, dass Sie siePATH
auch hier benötigen!env[rvm_path] = /usr/local/rvm env[rvm_prefix] = /usr/local
Starten Sie nun neu
php-fpm
. Ihr Dienstname kann sich von meinem unterscheiden; ich verwende den 5.6-Build von ondrej/php.Ubuntu 15.04 und neuer (systemd):
$ sudo systemctl restart php5.6-fpm
Ubuntu 14.10 und neuer:
$ sudo service php5.6-fpm restart
Schließlich müssen Sie im Skript selbst
cd
das Verzeichnis angeben, aus dem Sie den Befehl ausführenbundle
. Mein kurzes Skript sieht folgendermaßen aus: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
Funktioniert bei mir!