我正在 Apache 伺服器上運行 PHP 應用程式。我需要從 php 應用程式在命令列上運行 ruby 腳本。我已經驗證直接從終端運行腳本user
, 可以正常工作。本地 ruby 環境user
是透過設定路徑變數和來源來設定的/home/user/.rvm/scripts/rvm
,這允許腳本使用語句載入需求require
。
現在,透過 php 應用程序,腳本在這些 require 語句處失敗,我認為這是因為沒有為使用者設定 ruby 環境www-data
。我以前從未使用過 ruby,我不確定設定該環境的正確方法是什麼
答案1
我能夠弄清楚這一點。我在 SO 上發布了我的問題的答案。希望能幫助你!
https://stackoverflow.com/a/40224414/1672458
我能夠弄清楚這一點。首先,我已安裝的rvm作為多用戶安裝,以確保
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
以安裝所需的任何 gem。因為 rvm 是多用戶安裝,所以這些 gem 儲存到系統中,而不是儲存到您的特定使用者。$ 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 版本 ondrej/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
對我有用!