PHP 无法识别我的 RVM Ruby 安装



背景:我正在使用PHP构建网站,我需要将网站调用一个用Ruby 1.9编写的脚本。我正在使用已安装了Ruby 1.8的CentOS 5.10服务器,我使用RVM升级为Ruby 1.9。当我从命令行键入ruby --version时,它说我已安装Ruby 1.9(如预期)。但是,当我使用PHP调用exec('ruby --version');时,它说我已安装Ruby 1.8。此外,当我使用PHP调用exec('which rvm');时,即使我知道安装了RVM,它也不会返回任何内容。

问题:如何允许PHP使用RUBY 1.9的RVM安装而不是系统安装Ruby 1.8?

请务必记住,运行Web服务器进程的用户执行您的php脚本是与您(用户)使用命令时的不同的线。为了验证这一点,您可以创建一个PHP脚本,如下:

<?php
print exec('whoami');

从命令行中运行该脚本,您会看到用户名。将该脚本放在Web访问的文件夹中,然后通过您的Web浏览器运行(例如:http://localhost/whoami.php),您可能会看到一个用户名apachewww-data

您还可以比较在命令行和Web浏览器之间在您之间运行的Ruby。使用以下PHP脚本:

<?php
print exec('which ruby');

从命令行中运行该操作,然后在Web浏览器中运行。这些应该是两个不同的位置 - 当然,这是您的核心问题。

安装RVM时,可能会在主文件夹中将一系列代码线附加到您的.bash_profile.profile文件上。查看两个文件的末尾,查看是否有一条线看起来与此相似:

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*

每次登录或打开终端时,此行都会初始化您的外壳环境,以便可以访问RVM。为了验证这一点,您可以使用以下内容创建一个PHP文件:

<?php
print exec('env | grep rvm');

从命令行中运行它,您应该看到与rvm_bin_pathrvm_path等相关的行。但是,将此脚本放入可访问的文件夹中,然后从浏览器中运行它 - 您会注意到这些行都不会输出到浏览器中。这是因为 shell 在以www-data用户运行时(或Web服务器运行的任何用户运行时,PHP进程都不会具有与`.bash_profile脚本相同的RVM初始化行。

解决此问题的一种可能方法是在PHP中设置正确的环境变量,以便在调用exec时,在已经正确初始初始化以运行RVM相关的事物的环境中调用它(例如设置Ruby版本)。但是,最有可能的是,PHP上有某些SAFE_MODE保护,可以阻止您在PHP脚本中设置这些环境变量。

另一种解决方案,有点像黑客,是将您的PHP脚本在浏览器中运行相同 Ruby解释器,您将在命令行中运行。也就是说,您将进行exec('/home/my_username/.rvm/rubies/ruby-1.9/bin/ruby some_ruby_file.rb'),而不是exec('ruby some_ruby_file.rb')-我刚刚构成了Ruby解释器的那条路。从命令行中运行which ruby,以找出Ruby解释器的确切路径。但是您必须确保www-data有权在文件夹中运行此Ruby解释器。为了避免这种麻烦,尽管这更像是一个黑客,但仅仅是为了制作该红宝石解释器的副本,并将其放在www-data拥有的bin文件夹中,并将您的php脚本exec与Ruby Renterge。

<</p> <</p>

您必须指定Ruby和Gem_home的完整路径。

示例,让我工作:

        var_dump(exec("
export GEM_HOME='/home/www/.rvm/gems/ruby-2.3.0';
export GEM_PATH='/home/www/.rvm/gems/ruby-2.3.0:/home/www/.rvm/gems/ruby-2.3.0@global';
export MY_RUBY_HOME='/home/www/.rvm/rubies/ruby-2.3.0';
/home/www/.rvm/rubies/ruby-2.3.0/bin/ruby public/okcredit.ge/scripts/restrictions-and-pledges-bot/crawler.rb"));

最新更新